0%

记一次反射在不同ClassLoader加载jar实战

当我们Jvm中存在两个不同的ClassLoader,想要从一个ClassLoader里调用另一个ClassLoader里的Class如何操作
此操作很危险,当使用了此方法以后,加载到另一个ClassLoader的类不应再在原来的ClassLoader里使用,否则将找不到此类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static {
try {
//反射得到所需要的addURL方法
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
//破坏权限
method.setAccessible(true);
//Helper为辅助类 不可显式调用要加载到另一个ClassLoader中的类 否则失败.
URL url = Helper.class.getProtectionDomain().getCodeSource().getLocation();
//invoke 另一个classloader
method.invoke(WantLoadClassLoaderSomeClass.class.getClassLoader(), url);
//反射拿到我们要加载进去的Class/Jar
Class<?> clazz = Class.forName("AddClassName", true, MinecraftForge.class.getClassLoader());
//加载完成,可在另一个ClassLoader中 实例化调用/静态调用
WantLoadClassLoaderSomeClass.register(clazz.newInstance());
}catch (Throwable e){
e.printStackTrace();
}
}