原理
类加载(ClassLoader)入口提供
protected final Class<?> defineClass(String name, byte[] b, int off, int len)
大致的意思就是通过字节码文件加载,知道了这个方法就可以实现:能拿到字节码就能加载~
代码实现
自定义类加载器
package cn.com.test;
public class RemoteClassLoad extends ClassLoader{
public Class<?> load(byte[] data,int length){
return super.defineClass(null, data, 0, length);
}
}
编写测试类
package cn.com.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class RemoteClassLoadTest {
public static void main(String[] args) throws IOException {
// 模拟远程读取class的文件内容 开始
byte[] data = new byte[1024*1024*2];
FileInputStream fi = new FileInputStream("/Users/tmp/cn/com/test/JarTest.class");
int length = fi.read(data);
// 模拟远程读取class的文件内容 结束
// 加载
Class<?> obj = new RemoteClassLoad().load(data, length);
// 使用
try {
Object jarTestInstance = obj.newInstance();
for (Method method : obj.getMethods()) {
try {
method.invoke(jarTestInstance);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
}
执行结果
总结
好像没啥可总结的