把
Class clazz = ctClass.toClass();
替换为
BytecodeClassLoader classLoader =BytecodeClassLoader.getInstance();
String typeName = Person.class.getTypeName();
byte[] b = ctClass.toBytecode();
Class clazz = classLoader.defineClass(typeName, b);
BytecodeClassLoader 类
public class BytecodeClassLoader extends ClassLoader {
//可以搞成单例对象
private final static BytecodeClassLoader INSTANCE = new BytecodeClassLoader();
private BytecodeClassLoader() {}
/**
* 获得{@link BytecodeClassLoader}单例对象
*/
public static BytecodeClassLoader getInstance() {
return INSTANCE;
}
/**
* 将字节数组转换为class类的实例。
* 在使用该类之前,必须先解析它
*
* @param name 类的预期二进制名称(如{@code "java.lang.Object"})
* @param b 组成类数据(class文件)的字节数组
* @return {@link Class}
*/
public Class defineClass(String name, byte[] b) {
//把defineClass方法转换为public修饰
return defineClass(name, b, 0, b.length);
}
可以包装为方法
/**
* 将字节数组转换为class类的实例
*
* @param name 类的预期二进制名称(如{@code "java.lang.Object"})
* @param b 组成类数据(class文件)的字节数组
* @return {@link Class}
*/
public static Class defineClass(String name, byte[] b) {
class BytecodeClassLoader extends ClassLoader {
public Class defineClass(String name, byte[] b) {
//把defineClass方法转换为public修饰
return defineClass(name, b, 0, b.length);
}
}
return new BytecodeClassLoader().defineClass(name, b);
}