系列文章目录
01 使用Javassist实现Hello World
文章目录
- 系列文章目录
- 前言
- 引入Javassist jar包
- 使用Javassist实现Hello World
- 总结
- 说明
前言
本篇文章为Javassist入门系列文章,适合了解Java基础语法的人零基础学会使用Javassist实现一个Hello World程序。
引入Javassist jar包
使用Idea创建一个maven工程,并引入javassist的jar包。
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
使用Javassist实现Hello World
/**
* 【Javassist】快速入门系列01 使用Javassist实现Hello World
* 公众号&B站:精致的王同学
* @author 精致的王同学
* @date 2022/12/18 23:11
*/
public class Basic01HelloWorld {
public static void main(String[] args) throws Exception {
// 获取javassist默认类池
ClassPool pool = ClassPool.getDefault();
// 创建Hello类
CtClass ctClass = pool.makeClass("target.classes.basic.domain.Hello");
// 创建main方法
CtMethod ctMethod = CtNewMethod.make("public static void main(String[] args){System.out.println(\"Hello world\");}", ctClass);
// 将方法添加到ctClass中
ctClass.addMethod(ctMethod);
// 将类写成文件
ctClass.writeFile();
// 获取生成后类的class文件
Class<?> helloClazz = ctClass.toClass();
// 实例化生成后的类
Object hello = helloClazz.newInstance();
// 调用生成后的类的main方法
Method main = helloClazz.getDeclaredMethod("main",String[].class);
// 调用生成的main方法
main.invoke(hello,(Object) new String[0]);
}
}
以上Basic01HelloWorld 类创建了一个main方法,该方法中首先调用ClassPool.getDefault()创建了一个javassist默认的类池,该类池通过调用makeClass方法用于创建target.classes.basic.domain.Hello类。
然后调用CtNewMethod.make方法来创建Hello类的main方法。其中第一个参数为包括方法签名及方法体的字符串。第二个参数为CtClass类的一个实例。本例中代表创建的Hello类的CtClass对象。
创建好main方法之后,调用ctClass.addMethod方法将创建好的方法添加到CtClass类的对象中。最后调用ctClass.writeFile方法将类写成文件。
此时点击运行该类,可以看到target.classes.basic.domain目录下已经生成了一个Hello.class文件
之后我们通过ctClass.toClass方法获取生成的class文件,并调用newInstance方法创建它的实例。
通过getDeclaredMethod方法获取Hello类中声明的main方法的对象后,通过invoke方法调用。invoke方法第一个参数为Method 对象,第二个参数为main方法的参数。
注意此处需要用(Object)强制转换,因为invoke方法的第二个参数为Object…类型。
下面是运行结果:
总结
本篇文章介绍了使用Javassist创建一个Hello类,并在屏幕输出Hello World。同时也简单介绍了Javassist如何创建类和添加方法。