2014-10-31 41 views
0

question I asked earlier我知道爲了確保某些註釋存在或不在某個類的某個位置,我需要使用可以訪問註解和類的類加載器重新加載它。如何重新加載一個類,使註解變得可見?

現在我正在努力如何這樣的類加載器工作。在我的設置中,我只是將註釋標記爲java.lang.Class實例,並且可能使用該註釋註釋的類也是java.lang.Class實例。兩者都可能被一些我不知道的不同類加載器加載(類可能被遠程加載,因此它們不在本地文件系統中)。

在尋找我found this 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的類實例的類實例。使用CA的類加載器按照該順序實例化JoinClassLoader作爲委派類加載器。請問JoinClassLoader在調用findClass時重新加載類C,以便在實際註釋C時註釋A始終可見?如果不是這樣的類加載器實際上是怎樣的?

回答

0

在我提出的問題前,我才知道,爲了真正 肯定一些註釋是在I類 需要與同時訪問一個類加載器加載它存在或不存在的地方 - 註釋和類。

如果一個類已經被一個可能無法訪問所有註解的類加載器加載,我可以相信這是真的。不過,我認爲你得出了錯誤的結論。

如果您希望能夠在運行時反思分析類的註釋,那麼最好的解決方案不是重新加載它。相反,您應該確保通過類加載器將第一個地址加載到中,該類加載器也可以查看感興趣的註釋。 (如果結果不夠充分,那麼我不明白你可以怎樣期待重新加載來幫助。)

在任何情況下,重新加載類給你一個不同的類(同名),甚至如果它的字節碼與先前加載的版本的字節碼相同。將它用於反射分析以外的任何東西都很棘手,而且很難確定這兩個類實際上是否具有相同的字節碼。重新加載肯定不會用新加載的替換現有的類。所有的樂趣可以隨之而來。

相關問題