Javassist与ClassLoder学习笔记
Javassist学习笔记
前言
Javassist是一个用于在Java程序中编辑字节码的开源库。它允许开发人员动态修改和生成Java类文件,从而可以在运行时动态地改变类的行为。Javassist还提供了许多工具和API,用于操作Java字节码,例如创建新的类、修改类的方法、属性和注解等。它被广泛应用于Java的动态代理、AOP编程、代码生成和类加载器等领域
测试demo1
package demo;
import javassist.*;
public class JavassistDemo {
public static void main(String[] args) throws Exception{
//获取类的搜索路径
ClassPool classPool = ClassPool.getDefault();
//从搜索路径中获取对应类的CtClass对象,如果没有,则会自动加入
CtClass dynamicClass = classPool.makeClass("DynamicClass");
//添加一个方法
CtMethod dynamicMethod = CtNewMethod.make("public void dynamicMethod() { System.out.println(\"This is a dynamic method\");}",dynamicClass);
dynamicClass.addMethod(dynamicMethod);
//将新类写入文件
dynamicClass.writeFile();
//使用新类 实例化对象
Class<?> clazz = dynamicClass.toClass();
Object o = clazz.newInstance();
clazz.getMethod("dynamicMethod").invoke(o);
}
}
生成class文件并自动调用
测试demo2
写一个Hello.java
package demo;
public class Hello {
public void SayHello(){
}
}
ClassLder.java
package demo;
public class ClassLder extends ClassLoader{
public ClassLder(ClassLoader parent){
super(parent);
}
public Class define(byte[] b){
return super.defineClass(b,0,b.length);
}
}
测试demo代码2
package demo;
import javassist.ClassPool;
import javassist.CtClass;
public class JavassistDemo2 {
public static void main(String[] args) throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get(Hello.class.getName());
String cmd = "System.out.println(\"Hello\");";
ctClass.makeClassInitializer().insertBefore(cmd);
ctClass.setName("Hello");
ctClass.writeFile();
//使用ClassLoder 实例化对象
final byte[] classBytes = ctClass.toBytecode();
ClassLder loader = new ClassLder(JavassistDemo2.class.getClassLoader());
loader.define(classBytes).newInstance();
}
}
ClassLoader是Java内置的一个类,可以实现将字节码加载为内存形式的class对象,然后进行进一步的操作