![](/img/trans.png)
[英]if this annotation not written to bytecode, how is it able to be accessed at runtime?
[英]How to scan for a particular annotation of java classes loaded at runtime as a bytecode?
我使用谷歌的思考和第三方圖書館的自定義類加載器。
掃描類的工作原理如下:
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.