如何自己实现一个lombok插件

一,lombok的原理
主要作用就是根据注解生成代码
1.如何让源代码在编译时根据自定义逻辑编译
主要依赖于 AbstractProcessor 注解处理器来完成这,代码在编译时会触发实现该抽象类的 process 方法。如果也要在源代码在编译时进行操作。就在这个方法里进行自定义。

      @SupportedAnnotationTypes("org.example.xtcs.annotate.Xtcs")
      @SupportedSourceVersion(SourceVersion.RELEASE_8)
      @AutoService(Processor.class)
      public class XtcsAnnotationProcessor extends AbstractProcessor {
          java.util.List<String> fieldNames = new ArrayList<>(Arrays.asList("XTCS1", "XTCS2", "XTCS3"));


          private JavacTrees javacTrees; // 获取 JcTree
          private TreeMaker treeMaker; // 构建生成 jcTree
          private Names names;


          @Override
          public synchronized void init(ProcessingEnvironment processingEnv) {
              System.out.println("【Xtcs】编译注释处理器");
              processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "这是我的处理器");
              javacTrees = JavacTrees.instance(processingEnv);// 语法树
              Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
              this.treeMaker = TreeMaker.instance(context);
              super.init(processingEnv);
              this.names = Names.instance(context);

          }

          @Override
          public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

              for (Element element : roundEnv.getElementsAnnotatedWith(Xtcs.class)) {
                  // 获取字段信息
                  String className = element.getSimpleName().toString();
                  TypeMirror fieldType = element.asType();
                  System.out.println("类路径-------------" + fieldType.toString());
                  JCTree tree = javacTrees.getTree(element);
                  JCTree.JCClassDecl classDecl = (JCTree.JCClassDecl) tree;
                  // 创建字段
                  fieldNames.stream().forEach(fieldName -> {
                      createClass(classDecl, fieldName);
                  });


              }
              return true;
          }
      }

2.如何修改编译结果
这里就涉及到一个比较复杂的技术,java语法抽象树 JCTree. 可以修改类对应的JCtree结构。来实现自定义编译。JCtree对应的学习资料放在最下面。

3.实现效果
如下有一个类,我加了@Xtcs的注解,希望让其生成自定自定义类名的多个内部类。每个内部类中生成一个String类型成员变量和一个static方法,方法需调用主类的static 方法。 大家猜下我实现这个场景要干嘛!!!!

源代码:

  @Xtcs
  public class Student {
      private static CspzService cspzService;
      private static XtcsVo get(String csdm){
          XtcsVo xtcsVo = new XtcsVo();
          xtcsVo.setXtcsid(csdm);
          return xtcsVo;
      }
  }

编译后代码:
二,lombok的组成

我们来分析 lombok的组成:

1. 首先要依赖 lombok 的jar包。其中主要包含了 根据注解生成代码的逻辑。

2.编辑器 idea eclipse ....需要安装lombok提供的插件

其实有第一天已经可以实现lombok 的功能了。 但是没有代码补全和编辑器显示异常,因为编辑器不会动态的去扫码的编译后文件。他识别不到你编译后生成的代码。 所以插件的作用就是完成以上问题。 

三,idea插件的开发

 经过第一步我们已经完成了。 lombok jar 包部分的功能。 接下来我们要做的是如何开发一个idea 插件。 让其识别我们编译后的代码,进行代码自动补全。
posted @ 2024-12-20 16:07  it-Curry  阅读(53)  评论(0)    收藏  举报