package com.syj;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandlerFactory;
import com.syj.test.A;
/**
*
* Title: 自定義的類加載器Demo *
* ** Copyright: Copyright (c) 2007 *
* * @author 孫鈺佳 * @qq 4115291 * @main [email protected] * @date Jun 8, 2008 2:06:15 PM */ public class MyClassLoader extends URLClassLoader { public MyClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) { super(urls, parent, factory); } public MyClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); } public MyClassLoader(URL[] urls) { super(urls); } /** * 當加載com.syj.test包下的類時先自己找,找不到再使用jvm默認的加載順序 */ protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { if (name.startsWith("com.syj.test")) return myLoadClass(name, resolve); else return super.loadClass(name, resolve); } /** * * Description:先判斷類是否已經加載,如果沒有加載先在自己的URL下找,找不到再使用jvm默認的委託機制查找 * (注:正常類加載順序是先找最上層如果找不到依次往下找,這裏先找自己如果找不到遵循正常的查找原則,從上向下重找一次) * * @param name * @param resolve * @return * @throws ClassNotFoundException * @author 孫鈺佳 * @since:2008-6-8 下午02:10:07 */ protected synchronized Class myLoadClass(String name, boolean resolve) throws ClassNotFoundException { Class c = findLoadedClass(name); if (c == null) { try { c = findClass(name); } catch (ClassNotFoundException e) { return super.loadClass(name, resolve); } } return c; } public static void main(String[] args) throws Exception { URL[] url = new URL[] { MyClassLoader.class.getClassLoader() .getResource("") };// MyClassLoader mc = new MyClassLoader(url); // 這地方不能強轉換爲A,因爲不是一個類加載器加載的對象是不能轉換的,例如A a=(A),這裏的A是AppClassLoader加載的 System.out.println(A.class.getClassLoader().getClass().getName());// 打印sun.misc.Launcher$AppClassLoader Object a = mc.loadClass("com.syj.test.A").newInstance(); System.out.println(a.getClass().getClassLoader().getClass().getName());// 打印com.syj.MyClassLoader // 如果想調用a的方法只能使用反射了 } }