本文共 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 Listdims; //初始化多长的数组 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/