在上一篇文章java抽象语法树(AST)中已经介绍了部分定义语法树的的节点,接下来在这篇将会通过样例代码以及注释介绍如何使用语法树节点来生成setter、getter、toString、hash、equal 等方法。
需要通过注解处理器生成 setter、getter、toString、hash、equal的类如下
1 |
|
语法树的访问是通过继承 TreeTranslator
,并且重写了 visitClassDef 方法来实现访问 DemoC 类通过语法节点来访问 DemoC 中的变量。
setter 方法生成样例
产生类似于 public void setter(int a){this.a = a;}
的代码,需要用到的语法树节点分别有 JCModifiers、JCExpression、JCVariableDecl、JCStatement、JCBlock
定义 public 可以使用 treeMaker.Modifiers(Flags.PUBLIC)
定义 void 返回类型可以这样使用 treeMaker.TypeIdent(TypeTag.VOID)
定义方法名称 这可以 通过 Names 工具来实现,比如 name.fromString(“setA”);
方法名中的大小写字母这些细节可以通过字符串截取其中一个字符来实现。
参数 的定义可以这样treeMaker.VarDef(treeMaker.Modifiers(Flags.PARAMETER),jcVariableDecl.name,jcVariableDecl.vartype,null)
来实现。
最后 this.xxx = xxx;
语句的构建通过 treeMaker.Exec( treeMaker.Assign( treeMaker.Select(treeMaker.Ident(names.fromString("this")),jcVariableDecl.name), treeMaker.Ident(param.name)))
详细的代码如下:
1 | /** |
getter 方法生成样例
1 | /** |
toString 方法生成
1 | /** |
hash 方法生成
1 | /** |
equal 方法生成
1 | /** |
最后整个语法树生成代码的测试样例代码如下:
1 | package com.demo; |
最后的编译生成的字节码结果如下:
1 |
|