2010-10-14 76 views
21

有沒有一個命令行工具,最好在JDK中,它可以打印類文件中的所有註釋,或者將特定註釋作爲參數打印?如何通過命令行查看java classfile的註釋?

如果是這樣,是否有一個等同的命令可以運行在一個jar文件中包含的特定類?

我已經搜索了一段時間,沒有運氣。 :(

回答

11

糾正我,如果即時通訊錯了,但我認爲,註釋從編譯器從類中除去,除非您在Annotations本身上使用Annotation @Retention(RetentionPolicy.RUNTIME),信息將不會保留在 類文件。如果註釋在類文件保存下來,你可以使用的javap(JDK的一部分),看看這些:

javap my.package.MyClass 

更新:這似乎需要JDK7,JDK6的javap的犯規打印註釋,但您可以使用華盛頓大學網站提供的以下工具提取註釋信息:

Annotation-utilities

+0

感謝。我正在玩JDK/bin目錄中的工具,並找到了這個工具。這似乎並沒有顯示註釋,但我可以通過文本編輯器看到它:「RuntimeVisibleAnnotations^A^@!L /VersionID;^A^@^Evalue^A^@^P $ Revision: 1.5 $「 – 2010-10-14 13:30:23

+0

我應該按照您的指定添加此批註的@Retention(RetentionPolicy.RUNTIME)。 – 2010-10-14 13:31:40

+1

是否需要運行具有任何附加標記以顯示註釋的'javap'?當我運行'javap java.lang.String'時沒有看到它們。 – 2011-08-22 18:04:33

21

在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 
+0

1.7+這是正確的答案。 – OscarRyz 2017-10-12 20:39:35