security.MyClassLoaderTest 入口点
Class security.MyClassLoaderTest
package security;
import java.lang.reflect.Method;
import java.net.URL;
public class MyClassLoaderTest {
public static void main(final String[] args) throws Exception {
URL[] urls = new URL[] {new URL("file://C:/temp4Java/external_classes/")};
PluginClassLoader pluginClassLoader = new PluginClassLoader(urls, MyClassLoaderTest.class.getClassLoader());
ClassLoader old = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(pluginClassLoader);
invokePulginMethod();
Thread.currentThread().setContextClassLoader(old);
}
public static void invokePulginMethod() throws Exception {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("gc.Foo");
Method method = clazz.getMethod("say", (Class[]) null);
method.setAccessible(true);
Object obj = clazz.newInstance();
method.invoke(obj, (Object[]) null);
System.out.println(clazz);
System.out.println(clazz.getClassLoader());
System.out.println(clazz.getClassLoader().getParent());
}
}
//output:
hei Man I am here!
class gc.Foo
security.PluginClassLoader@600060
sun.misc.Launcher$AppClassLoader@61c861c8
Custome ClassLoader:
package security;
import java.net.URL;
import java.net.URLClassLoader;
public class PluginClassLoader extends URLClassLoader {
public PluginClassLoader(final URL[] urls, final ClassLoader parent) {
super(urls, parent);
}
}
gc.Foo编译好了之后放到C:/temp4Java/external_classes/底下
package gc;
public class Foo {
public void say() {
System.out.println("hei Man I am here!");
}
}
Bootstrap
|
Extension
|
System
|
Customer
如果你要想在 System ClassLoader 加载的类里面使用 位于 Customer class loader指定位置的类,
办法就是只能在 System ClassLoader 加载的类里面获得一个Customer class loader,OK! 这样你就可以折腾它(Customer class loader,) 里面的类了.
怎么取得了:
1. 传个reference 到 System ClassLoader 加载的类.
2. 放到T hread.setContextContext 里面.
Done!! Thread.getContextContext 就是这么折腾的
记录之