有没有命令行工具可以打印类文件中的所有注解或以特定注解作为参数进行打印?最好是在JDK中提供的工具。
如果有,是否有等效的命令可用于运行在jar文件上,针对其中包含的特定类?
我已经搜索了一段时间,但没有找到相关信息,感觉很失望 :(
有没有命令行工具可以打印类文件中的所有注解或以特定注解作为参数进行打印?最好是在JDK中提供的工具。
如果有,是否有等效的命令可用于运行在jar文件上,针对其中包含的特定类?
我已经搜索了一段时间,但没有找到相关信息,感觉很失望 :(
在使用 javap 版本为 1.7 或更高版本时,可以使用 -verbose 或 -v 标志来显示保留的注释。
示例:
javap -p -v ./services/target/windup-web-services/WEB-INF/classes/org/jboss/windup/web/services/model/RegisteredApplication.class
#50 = Utf8 Ljavax/persistence/Column;
#64 = Utf8 Lorg/jboss/windup/web/services/validators/NotBlankConstraint;
#67 = Utf8 Ljavax/validation/constraints/Size;
...
private java.lang.String title;
descriptor: Ljava/lang/String;
flags: ACC_PRIVATE
RuntimeVisibleAnnotations:
0: #50(#62=I#63)
1: #64(#65=s#66)
2: #67(#68=I#69,#70=I#63,#65=s#71
如果我说错了,请纠正我。我的理解是:除非你在注释本身上使用注释@Retention(RetentionPolicy.RUNTIME),否则编译器会从类中删除注释,这意味着信息不会在类文件中保存下来。 如果注释被保存在类文件中,您可以使用javap(JDK的一部分)来查看它们:
javap my.package.MyClass
更新:似乎需要JDK7,JDK6的javap不会输出注释,但你可以使用华盛顿大学网站上的以下工具提取注释信息:
javap
命令时,是否需要使用其他标志才能显示注解?当我运行javap java.lang.String
时没有看到它们。 - Amanda SRetentionPolicy.CLASS
会发生什么吗?根据 javadoc 的说明,编译器应该将注解记录在类文件中,但不需要在运行时由 VM 保留。它说注解应该记录在类文件中。但是,在使用 javap 进行反编译时,我没有看到注解。在我的测试中,我只是使用了 Guava 中的@VisibleForTesting
注解。 - tuk