JavaDemo——模仿lombok使用注解生成Setter和Getter方法

模仿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)

  1. RetentionPolicy.SOURCE‌:

    • 作用‌:注解仅保留在‌源代码级别‌。
    • 处理时机‌:编译时被编译器丢弃,不会写入编译后的 .class 文件中。
    • 典型用例‌:供编译器检查或生成代码(如 @Override@SuppressWarnings)。
  2. RetentionPolicy.CLASS‌:

    • 作用‌:注解保留到‌字节码文件‌(.class文件)中。
    • 处理时机‌:Java 虚拟机(JVM)加载类时‌不一定保留‌到内存(运行时不可见)。
    • 默认策略‌:若未显式声明 @Retention,则默认为此级别。
  3. 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值