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对象,然后进行进一步的操作

posted @ 2023-11-17 19:01  BattleofZhongDinghe  阅读(14)  评论(0编辑  收藏  举报