博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Annotation 修改 Field 变量的初始化语句。
阅读量:4090 次
发布时间:2019-05-25

本文共 2446 字,大约阅读时间需要 8 分钟。

资料绝少,幸有指路明灯:,可将 String 初始化为其上/**文档*/

JCVariableDecl.init = maker.Literal("/**文档*/");

扩展AbstractProcessor -> 自定义 process 回调 -> roundEnv.getElementsAnnotatedWith(注解类) -> 遍历 elementUtils.getTree(编译元素) -> (JCVariableDecl变量声明) -> (初始化语句) = …

@Override	public boolean process(final Set
annotations, final RoundEnvironment roundEnv) { Set
fields = roundEnv.getElementsAnnotatedWith(Multiline.class); for (javax.lang.model.element.Element field : fields) { if(field.getKind() == ElementKind.FIELD){ //如果当前注解元素为Field变量 ……

此法只可修改 primitive 变量的初始化语句。


当用其他变量初始化时, 则有 JCVariableDecl.init.getClass() == JCTree.JCFieldAccess


尝试修改byte数组的初始化语句。

/**好孤独*/@Multiline()public final static byte[] jsBytes= new byte[12];

打印得知此时 JCVariableDecl.init.getClass() === JCTree.JCNewArray。

这个时候别想着往 JCNewArray 传 byte 数组了,它的参数都是JCExpression,没有 maker.Literal 那么方便。

继续打印,得:


public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {    public int pos;    public Type type;

public abstract static class JCExpression extends JCTree implements ExpressionTree {

public static class JCNewArray extends JCTree.JCExpression implements NewArrayTree {        public JCTree.JCExpression elemtype; //元素类型        public List
dims; //初始化多长的数组 public List
annotations; public List
> dimAnnotations; public List
elems; //数据,为空

再试一下其他构造:

public final static byte[] jsBytes= “哈哈哈”.getBytes();

ini.getclass() === JCMethodInvocation。

public final static byte[] jsBytes= new byte[]{1 , 2 , 3};

ini.getclass() === JCNewArray。此时数据不为空。但 dims 长度为空。

豁然开朗了,三处要点:

public List<JCTree.JCExpression> elems。

maker.Literal 。

maker.NewArray。

实现代码:

JCVariableDecl fieldNode = (JCVariableDecl) elementUtils.getTree(field);    TypeName typeName = TypeName.get(field.asType());    String name = typeName.toString();    if(name.equals("byte[]")) {        byte[] data = docComment.getBytes(StandardCharsets.UTF_8);        JCTree.JCExpression[] dataExp = new JCTree.JCExpression[data.length];        for (int i = 0; i < data.length; i++) {            dataExp[i] = maker.Literal((int)data[i]);        }        fieldNode.init = maker.NewArray(maker.TypeIdent(TypeTag.BYTE), List.nil(), List.from(dataExp));    }

修改成功:

弩戈有沉 和伐其光 以我为刀。

蒿菜莱草 蝼蚁烂芥 死不足惜。

唯有,握住一丈光芒,飞出黑暗深渊!

沉刀光 惜草芥

繁华皆幻,唯此情真,此意浓,而思切。

Solicitous

殷切 隐痛 何以悲欢同字 福祸共宇

亲血 痛切 的的确确 嫡嫡亲亲

如谁之似 思孰之想 想又何如

山玉有九万幢写法 骏马有三千匹名字

你只有一个人 三行思念 寥寥草草

转载地址:http://wmbii.baihongyu.com/

你可能感兴趣的文章
通过试题理解JavaScript
查看>>
webpack的面试题总结
查看>>
实践这一次,彻底搞懂浏览器缓存机制
查看>>
Koa2教程(常用中间件篇)
查看>>
React Hooks 完全指南
查看>>
React16常用api解析以及原理剖析
查看>>
教你发布你npm包
查看>>
nvm 和 nrm 的安装与使用
查看>>
React Hooks 一步到位
查看>>
React Redux常见问题总结
查看>>
前端 DSL 实践指南
查看>>
ReactNative: 自定义ReactNative API组件
查看>>
cookie
查看>>
总结vue知识体系之实用技巧
查看>>
PM2 入门
查看>>
掌握 TS 这些工具类型,让你开发事半功倍
查看>>
前端如何搭建一个成熟的脚手架
查看>>
Flutter ListView如何添加HeaderView和FooterView
查看>>
Flutter key
查看>>
Flutter 组件通信(父子、兄弟)
查看>>