【问题标题】:Annotation information missed after compiled with ECJ Compiler使用 ECJ 编译器编译后丢失注释信息
【发布时间】:2015-05-23 21:42:33
【问题描述】:

我发现ECJ编译器编译的字节码缺少注释信息。

javac编译的字节码反编译的源代码:

public class HelloWorldApp {

    @GetAction("/hello")
    public String sayHello() {
        return "Hello World!";
    }
}

ECJ编译的字节码反编译的源代码:

public class HelloWorldApp {

    public String sayHello() {
        return "Hello World!";
    }
}

很明显,ECJ 编译的字节码中缺少注释@GetAction("/hello")(在内存编译中)。

有人遇到过这个问题并得到任何线索吗?

更新更多信息

看看下面的截图:

所以它在 ASTNode.resolveAnnotations() 方法行 #797 中:

A) 状态 if ((method.tagBits & TagBits.AnnotationResolved) != 0) return annotations; 将返回 null 作为注释甚至

B) 源注解@GetAction("/hello") 之所以出现是因为

C) this.annotations 字段是 null

D) if 条件 (method.tagBits & TagBits.AnnotationResolved) != 0 评估为真

更新 2

看来我截屏太早了,所以处理完成后,我发现注释信息被存储了:

但是我仍然无法从结果文件中获取注释信息。点击here下载生成的字节码文件:

注意我使用的是 ECJ 4.4.1:

<dependency>
  <groupId>org.eclipse.jdt.core.compiler</groupId>
  <artifactId>ecj</artifactId>
  <version>4.4.1</version>
</dependency>

【问题讨论】:

    标签: eclipse javac ecj


    【解决方案1】:

    问题解决了!只需添加以下几行:

        opt(map, OPTION_TargetPlatform, "1.6");
    

    该问题是由于ECJ中默认JDK版本为1.2,不支持注解造成的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多