模仿lombok,使用注解,为类的属性生成Setter方法和Getter方法;
使用自定义注解以及注解解释器,在编译阶段,通过修改抽象语法树(AST)为类添加Getter和Setter方法;
首先maven导入操作AST要用的库(javac也是用的这个),这个库在jdk下lib的tools.jar中,根据自己的jdk目录配置systemPath;(jdk9+似乎需要使用模块化的方式配置)
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8.0</version>
<scope>system</scope>
<systemPath>G:/jdks/jdk-1.8/lib/tools.jar</systemPath>
</dependency>
项目结构:

编写Demo代码
先定义自定义注解Anno.java
package test;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(SOURCE)
@Target(TYPE)
public @interface Anno {
}
关于@Retention,AI的解释:
@Retention 的可用策略(RetentionPolicy)
RetentionPolicy.SOURCE:
- 作用:注解仅保留在源代码级别。
- 处理时机:编译时被编译器丢弃,不会写入编译后的
.class文件中。- 典型用例:供编译器检查或生成代码(如
@Override、@SuppressWarnings)。
RetentionPolicy.CLASS:
- 作用:注解保留到字节码文件(
.class文件)中。- 处理时机:Java 虚拟机(JVM)加载类时不一定保留到内存(运行时不可见)。
- 默认策略:若未显式声明
@Retention,则默认为此级别。
RetentionPolicy.RUNTIME:
- 作用:注解信息永久保留,在运行时可通过反射机制读取。
- 典型用例:框架级注解(如 Spring 的
@Autowired、JUnit 的@Test)。
关键注意事项
- 默认值:未指定
@Retention时,默认为RetentionPolicy.CLASS。- 组合使用:通常与
@Target配合,限制注解的应用目标(如方法、类)。- 反射依赖:只有
RUNTIME级别的注解能在运行时通过反射(如Annotation::getAnnotation)获取。
关于@Target,AI的解释:
@Target 的完整取值列表(ElementType 枚举)
-
ElementType.TYPE:
应用于类、接口、枚举或注解类型声明。-
ElementType.FIELD:
应用于字段(成员变量)或枚举常量。-
ElementType.METHOD:
应用于方法声明。-
ElementType.PARAMETER

最低0.47元/天 解锁文章
3693

被折叠的 条评论
为什么被折叠?



