V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
twogoods
V2EX  ›  程序员

Java 编译期修改抽象语法树进而改变编译后的字节码

  •  
  •   twogoods · 2017-11-06 23:06:36 +08:00 · 3670 次点击
    这是一个创建于 2608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    android 或者 java 玩过 Annotation Processing Tool 能帮我看看这个问题吗?

    JCIdent paramType = mTreeMaker.Ident(getName("String"));
    JCArrayTypeTree paramArray = mTreeMaker.TypeArray(paramType);
    JCVariableDecl paramDecl = mTreeMaker.VarDef(mTreeMaker.Modifiers(Flags.PARAMETER),
           getName("args"), paramArray, null);
    return List.from(new JCVariableDecl[]{paramDecl});
    

    如上代码可以构造出一个 方法的参数即String[] args
    我想构造这样一个方法query(@Tag(name="user")User user),方法参数里的注解就不知道该怎么构造了

    JCTree.JCIdent paramType =treeMaker.Ident(names.fromString("com.test.annotations.Tag"));
    JCTree.JCAssign jcAssign=treeMaker.Assign(treeMaker.Ident(names.fromString("value")),
         treeMaker.Ident(names.fromString("\"user\"")));
    JCTree.JCAnnotation jcAnnotation = treeMaker.Annotation(paramType, List.of(jcAssign));
    

    用上面构造的jcAnnotation去进一步构造JCVariableDecl,可是最终编译器告诉我:找不到符号:com.test.annotations.Tag

    5 条回复    2020-04-26 18:51:09 +08:00
    BigDogWang
        1
    BigDogWang  
       2018-08-11 16:35:33 +08:00 via iPhone
    请问你有 jctree 的 api 说明嘛?我找了好久不知道应该怎么操作 jctree
    twogoods
        2
    twogoods  
    OP
       2018-08-11 17:39:10 +08:00 via Android
    @BigDogWang 我也不知道,当初都是摸着石头过河,这一块的内容是不多见
    lld6
        3
    lld6  
       2020-04-26 16:43:05 +08:00
    楼主解决了吗?我也碰到这个问题了。。。
    twogoods
        4
    twogoods  
    OP
       2020-04-26 17:26:24 +08:00
    @lld6 #3 我差不多已经忘记了.....直接从 0 开始构造可能会有问题,我后来是在代码上写一个这样的注解,编译去读然后尝试把这个注解结构放在其他的地方。 我代码里 org.apache.ibatis.annotations.Param 这个注解手动在代码里写了一下

    https://github.com/twogoods/TgDao/blob/3245309d6f/tgdao-core/src/main/java/com/tg/dao/annotation/Params.java#L16

    https://github.com/twogoods/TgDao/blob/3245309d6f52d32d1ff5ce2ca6c64132caf0f398/tgdao-core/src/main/java/com/tg/dao/processor/ParamCodeGenerateProcessor.java#L111
    lld6
        5
    lld6  
       2020-04-26 18:51:09 +08:00
    @twogoods 感谢,我先看看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2642 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:48 · PVG 09:48 · LAX 17:48 · JFK 20:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.