如何通过命令行查看Java类文件的注释?

29

有没有命令行工具可以打印类文件中的所有注解或以特定注解作为参数进行打印?最好是在JDK中提供的工具。

如果有,是否有等效的命令可用于运行在jar文件上,针对其中包含的特定类?

我已经搜索了一段时间,但没有找到相关信息,感觉很失望 :(

2个回答

35

在使用 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

13

如果我说错了,请纠正我。我的理解是:除非你在注释本身上使用注释@Retention(RetentionPolicy.RUNTIME),否则编译器会从类中删除注释,这意味着信息不会在类文件中保存下来。 如果注释被保存在类文件中,您可以使用javap(JDK的一部分)来查看它们:

javap my.package.MyClass

更新:似乎需要JDK7,JDK6的javap不会输出注释,但你可以使用华盛顿大学网站上的以下工具提取注释信息:

注释工具


谢谢。我正在使用JDK/bin目录中的工具进行尝试,并找到了这个工具。但是它似乎没有显示注释,但我可以通过文本编辑器看到它:“RuntimeVisibleAnnotations^A^@!L<package removed>/VersionID;^A^@^Evalue^A^@^P$Revision: 1.5 $” - ares
我应该添加这个注释,因为你指定了@Retention(RetentionPolicy.RUNTIME)。 - ares
1
运行javap命令时,是否需要使用其他标志才能显示注解?当我运行javap java.lang.String时没有看到它们。 - Amanda S
@amanda:检查答案中的更新,你是否使用JDK < 7运行了javap? - fasseg
6
对我来说(除了jdk 7之外),需要使用“-v”选项。 - phs
@fasseg,你能告诉我如果注解的类型是 RetentionPolicy.CLASS 会发生什么吗?根据 javadoc 的说明,编译器应该将注解记录在类文件中,但不需要在运行时由 VM 保留。它说注解应该记录在类文件中。但是,在使用 javap 进行反编译时,我没有看到注解。在我的测试中,我只是使用了 Guava 中的 @VisibleForTesting 注解。 - tuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接