由于之前听别人提到,他们会将编译后的文件存入到数据库。然后通过读取数据库的方式获取到该字节码文件,反射获得该类,所以我就在想可以用什么方法做到。
由于我没找到市面上现有的方案,所以我就想到用java再带的native方法获得Class类,然后通过反射实例化类。之后我就就行了尝试,此方法为本人通过反射写的,如果有更好的方法,欢迎大家指导。
package net.amiba.reflect;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author bjw
*/
public class ProxyTest {
public static void main(String[] args) throws Exception {
// 这里可以通过从数据库读取,然后包装成FileInputStream
FileInputStream inputStream = new FileInputStream("Calc.class");
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
Class<Proxy> proxyClass = Proxy.class;
//private static native Class<?> defineClass0(ClassLoader loader, String name, byte[] b, int off, int len);
Method method = proxyClass.getDeclaredMethod("defineClass0",
ClassLoader.class,
String.class,
byte[].class,
int.class,
int.class);
method.setAccessible(true);
Constructor<Proxy> constructor = proxyClass.getDeclaredConstructor();
constructor.setAccessible(true);
Proxy proxy = constructor.newInstance();
Class clazz = (Class) method.invoke(proxy, ProxyTest.class.getClassLoader(), "net.amiba.reflect.Calc", bytes, 0, bytes.length);
Method add = clazz.getMethod("add", int.class, int.class);
int result = (int) add.invoke(clazz.newInstance(), 1, 2);
System.out.println(result);
}
}