资料绝少,幸有指路明灯:github/multiline,可将 String 初始化为其上/**文档*/
:
JCVariableDecl.init = maker.Literal("/**文档*/
");
扩展AbstractProcessor -> 自定义 process 回调 -> roundEnv.getElementsAnnotatedWith(注解类) -> 遍历 elementUtils.getTree(编译元素) -> (JCVariableDecl,变量声明) -> (初始化语句) = …
@Override
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
Set<? extends Element> 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<JCTree.JCExpression> dims; //初始化多长的数组
public List<JCTree.JCAnnotation> annotations;
public List<List<JCTree.JCAnnotation>> dimAnnotations;
public List<JCTree.JCExpression> 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
殷切 隐痛 何以悲欢同字 福祸共宇
亲血 痛切 的的确确 嫡嫡亲亲
如谁之似 思孰之想 想又何如
山玉有九万幢写法 骏马有三千匹名字
你只有一个人 三行思念 寥寥草草