簡體   English   中英

如何重新加載類以使注釋可見?

[英]How to reload a class so that a annotation becomes visible?

前面我問的一個問題中,我了解到,為了真正確保某個類中是否存在某些注釋,我需要使用可以同時訪問該注釋和該類的類加載器重新加載它。

現在,我正在為這樣的類加載器如何工作而苦苦掙扎。 在我的設置中,我只是將注釋作為java.lang.Class實例,而可能使用該注釋進行注釋的類也將作為java.lang.Class實例。 兩者都可能由我不了解的一些不同的類加載器加載(類可能是遠程加載的,因此它們不在本地文件系統上)。

在搜索時,我發現了這個JoinClassLoader

/**
* A class loader that combines multiple class loaders into one.<br>
* The classes loaded by this class loader are associated with this class loader,
* i.e. Class.getClassLoader() points to this class loader.
* <p>
* Author Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland, www.source-code.biz<br>
* License: LGPL, http://www.gnu.org/licenses/lgpl.html<br>
* Please contact the author if you need another license.
*/
public class JoinClassLoader extends ClassLoader {

private ClassLoader[] delegateClassLoaders;

public JoinClassLoader (ClassLoader parent, ClassLoader... delegateClassLoaders) {
   super (parent);
   this.delegateClassLoaders = delegateClassLoaders; }

protected Class<?> findClass (String name) throws ClassNotFoundException {
   // It would be easier to call the loadClass() methods of the delegateClassLoaders
   // here, but we have to load the class from the byte code ourselves, because we
   // need it to be associated with our class loader.
   String path = name.replace('.', '/') + ".class";
   URL url = findResource(path);
   if (url == null) {
      throw new ClassNotFoundException (name); }
   ByteBuffer byteCode;
   try {
      byteCode = loadResource(url); }
    catch (IOException e) {
      throw new ClassNotFoundException (name, e); }
   return defineClass(name, byteCode, null); }

    // some code omitted

} // end class JoinClassLoader

所以我的問題是這樣的:

給定任意類C的類實例和可由任意類加載器加載的注釋類A的類實例。 JoinClassLoaderCA的類加載器實例化,作為委派類加載器。 JoinClassLoader會在調用findClass時重新加載類C ,以便在對C進行實際注釋時始終顯示注釋A嗎? 如果不是這樣的類加載器實際上將是什么樣子?

在前面我問的一個問題中,我了解到,為了真正確保某個類中是否存在某些注釋,我需要使用可以同時訪問該注釋和該類的類加載器重新加載它。

給定一個類加載器可能已經無法訪問所有注釋的類加載器已經加載了該類,我可以相信這是事實。 但是,我認為您得出了錯誤的結論。

如果您希望能夠在運行時反思性地分析類的注釋,那么最好的解決方案是不要重新加載它。 相反,您應該確保首先由一個類加載器加載它,該類加載器還可以看到感興趣的注釋。 (如果事實證明這還不夠,那么我看不到如何期望重新加載會有所幫助。)

無論如何,重新加載該類都會為您提供不同的類(同名),即使其字節碼與先前加載的版本相同。 這是棘手的使用任何東西,但反思分析,這是非常難以確定,這兩個類實際上確實有相同的字節碼。 當然 ,重新加載不會用新加載的類替換現有的類。 可以帶來各種樂趣。

暫無
暫無

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

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