如何自己实现一个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 插件。 让其识别我们编译后的代码,进行代码自动补全。

浙公网安备 33010602011771号