import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.SOURCE) // 注解只在源码中保留@Target(ElementType.TYPE) // 用于修饰类public @interface MyGetter { // 定义 Getter}再实现一个自定义的注解处理器 , 代码如下:
import com.sun.source.tree.Tree;import com.sun.tools.javac.api.JavacTrees;import com.sun.tools.javac.code.Flags;import com.sun.tools.javac.code.Type;import com.sun.tools.javac.processing.JavacProcessingEnvironment;import com.sun.tools.javac.tree.JCTree;import com.sun.tools.javac.tree.TreeMaker;import com.sun.tools.javac.tree.TreeTranslator;import com.sun.tools.javac.util.*;import javax.annotation.processing.*;import javax.lang.model.SourceVersion;import javax.lang.model.element.Element;import javax.lang.model.element.TypeElement;import javax.tools.Diagnostic;import java.util.Set;@SupportedSourceVersion(SourceVersion.RELEASE_8)@SupportedAnnotationTypes("com.example.lombok.MyGetter")public class MyGetterProcessor extends AbstractProcessor {private Messager messager; // 编译时期输入日志的private JavacTrees javacTrees; // 提供了待处理的抽象语法树private TreeMaker treeMaker; // 封装了创建AST节点的一些方法private Names names; // 提供了创建标识符的方法@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);this.messager = processingEnv.getMessager();this.javacTrees = JavacTrees.instance(processingEnv);Context context = ((JavacProcessingEnvironment) processingEnv).getContext();this.treeMaker = TreeMaker.instance(context);this.names = Names.instance(context);}@Overridepublic boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {Set extends Element> elementsAnnotatedWith = roundEnv.getElementsAnnotatedWith(MyGetter.class);elementsAnnotatedWith.forEach(e -> {JCTree tree = javacTrees.getTree(e);tree.accept(new TreeTranslator() {@Overridepublic void visitClassDef(JCTree.JCClassDecl jcClassDecl) {List自定义的注解处理器是我们实现简易版的 Lombok 的重中之重 , 我们需要继承 AbstractProcessor 类 , 重写它的 init() 和 process() 方法 , 在 process() 方法中我们先查询所有的变量 , 在给变量添加对应的方法 。我们使用 TreeMaker 对象和 Names 来处理 AST , 如上代码所示 。
- 保护企鹅的文章 保护企鹅我们应该做些什么
- 托福是什么意思
- 听力练习
- 冷冬来袭,温暖的房间可能暗藏危险
- 如何测试儿童智商 测小孩子的智商
- 倩女幽魂端游表情包 倩女幽魂游戏表情头像
- 人有永远不死的吗 永远不死的生物是什么
- 十首最气势磅礴的歌曲 气势磅礴的音乐有哪些
- 招投标项目管理师 项目管理师考试
- 青岛万象山 万象城 风水
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
