簡體   English   中英

如何掃描在運行時加載的java類的特定注釋作為字節碼?

[英]How to scan for a particular annotation of java classes loaded at runtime as a bytecode?

  1. 如果一個java類在運行時作為字節碼加載(例如通過ASM庫或其他機制),它是否在java的類路徑上? 我沒有看到它。
  2. 如果它不在java類路徑上,如何掃描以這種方式加載的類的所有注釋?

我使用谷歌的思考和第三方圖書館的自定義類加載器。

掃描類的工作原理如下:

            Reflections reflections = new Reflections(ClasspathHelper.forPackage("com.mypackage",
                    MyCustomClassLoader),
                    new SubTypesScanner(), new TypeAnnotationsScanner());
Set<Class<?>> myClasses = reflections.getTypesAnnotatedWith(MyAnnotation.class);

MyAnnotation - 標記為@Retention(RetentionPolicy.RUNTIME)。 上面(在類中)由JVM在運行時動態加載。

可以看出,在幕后,Reflections嘗試使用默認靜態和上下文的2個類加載器來掃描所有URL。

Reflection.scan()

更新:我找到了答案你能用反射找到包中的所有類嗎? 說“如果有類生成或遠程交付,你將無法發現這些類。” 但是,沒有證據。 可以請任何人提供更多詳細信息並確認嗎?

在運行時動態實例化類不會更改JVM正在使用的類路徑 發生的事情是某些ClassLoader類從某處獲取字節碼; 並使它“可用”給你。 但這決不會改變加載類的“搜索順序”(這基本上就是類路徑的內容:它只告訴JVM在何處以及以何種順序查找要加載的類)。

含義:類的任何“加載”都會導致類java.lang.Class的某個對象。

如果要查詢任何已加載類的結構; 你“只是”需要到達相應的Class對象。 Class提供getAnnotation()等方法。 它還提供了檢索表示特定類的方法和字段的其他對象的方法; 並且可以以類似的方式查詢這些對象的注釋。

更新,關於問題中的更新:在某些情況下,您無法訪問類來自的文件系統。 當你知道他們的名字時,你可以加載課程,但你無法查看這些課程所在的“地方”。 這基本上打破了你按預期使用反射的能力。

沒有必要“證明”,這只是Java允許您在知道名稱時加載類的結果,但“隱藏”這些類來自“where”的確切內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM