使用 ECJ Compiler 编译后遗漏的注释信息
Annotation information missed after compiled with ECJ Compiler
我发现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;
将 return null
作为注释 even
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>
问题已解决!只需添加以下行:
opt(map, OPTION_TargetPlatform, "1.6");
问题是由于JDKECJ默认版本为1.2,不支持注解
我发现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;
将 return null
作为注释 even
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>
问题已解决!只需添加以下行:
opt(map, OPTION_TargetPlatform, "1.6");
问题是由于JDKECJ默认版本为1.2,不支持注解