系列文章目录

01 在方法体的开头或结尾插入代码
02 使用Javassist实现方法执行时间统计
03 使用Javassist实现方法异常处理
04 使用Javassist更改整个方法体
05 当有指定方法调用时替换方法调用的内容
06 当有构造方法调用时替换方法调用的内容
07 当检测到字段被访问时使用语句块替换访问
08 当检测到对象(不包括数组)创建时用代码块替换
09 当检测到对象(不包括数组)创建时用代码块替换
10 当检测到instanceof表达式时用代码块替换
11 当检测到显示类型转换时用代码块替换
12 当检测到catch语句时在catch前插入代码
13 使用Javassist获取注解
14 使用Javassist导入包路径



前言

上一章我们介绍了使用Javassist获取注解,本章主要介绍使用Javassist导入包路径。


引入Javassist jar包

在上几篇文章已经引入了javassist的jar包,如果你是第一次观看本系列文章,也可以复制以下maven依赖将jar包导入工程。

        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.28.0-GA</version>
        </dependency>

使用Javassist导入包路径

除java.lang包外,Javassist的源代码中的所有类名必须是完全限定名(它们必须包括包名)。例如,Javassist编译器可以解析Object以及java.lang.Object。但是无法解析其他包下的类

要告诉编译器在解析类名时搜索其他包,请调用ClassPool中的importPackage方法。例如:

/**
 * 【Javassist】快速入门系列14 使用Javassist导入包路径
 * 公众号&B站:精致的王同学
 * @author 精致的王同学
 * @date 2023/1/1 0:51
 */
public class Basic14Import {
    public static void main(String[] args) throws Exception{
        // 获取javassist默认类池
        ClassPool pool = ClassPool.getDefault();
        // 导入domain包类
        pool.importPackage("domain");
        // 创建basic.Basic14Test类
        CtClass ctClass = pool.makeClass("basic.Basic14Test");
        // 为basic.Basic14Test类新增student字段 类型为domain.Student
        CtField make = CtField.make("private Student student;", ctClass);
        ctClass.addField(make);
        // 将类写成文件
        ctClass.writeFile();
    }
}

以上Basic14Import 类创建了一个main方法,该方法中首先获取javassist的类池pool,然后调用 pool.importPackage(“domain”)方法导入domain包。domian包中包含domain.Student类。

导入domain包之后我们使用pool.makeClass(“basic.Basic14Test”)创建一个basic.Basic14Test类。

然后使用CtField.make(“private Student student;”, ctClass)方法为basic.Basic14Test类新增student字段。
其中student字段的类型为 domain.Student 类。Student 源码如下:

/**
 * 学生类
 * 公众号&B站:精致的王同学
 * @author 精致的王同学
 * @date 2023/1/2 19:51
 */
public class Student {
    private Integer age;
    private String name;
    private String className;
}

最后调用ctClass.writeFile();将类输出成文件。如果不调用pool.importPackage(“domain”);这行代码,main方法执行结果如下:
不调用importPackage方法执行结果

调用pool.importPackage(“domain”)方法导入domain包。最终生成的类文件源码如下:
最终生成的类文件源码

总结

本篇文章介绍了如何使用Javassist导入包路径。了解了除java.lang包外,Javassist的源代码中的所有类名必须是完全限定名(它们必须包括包名)。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐