Java Annotation 修改 Field 变量的初始化语句。

资料绝少,幸有指路明灯: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


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

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

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


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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值