2011-10-19 29 views
1

我有兩個班UpObj和DownObjJava。我怎樣才能upcast類型使用反射?

public class UpObj { 

    public UpObj() { 
     System.out.println("Load UpObj "); 
    } 

} 

public class DownObj extends UpObj { 

    public DownObj() { 
     System.out.println("Load DownObj "); 
    } 

} 

public class Caller { 

    UpObj obj; 

    public Caller(UpObj obj) { 
     this.obj = obj; 
     System.out.println("!!!"); 
    } 

} 

public class GNUMakeFile { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     DownObj iView = new DownObj(); 
     Class<?> iViewClass = iView.getClass(); 
     Class<?> clazz; 
     try { 
      clazz = Class.forName("bla.bla.bla.Caller"); 
      Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

所以,我想在上溯造型構造來電顯示我的孩子類型DownObj父UpObj。 我認爲這是可能的幫助仿製藥。像這樣的東西。任何人都知道如何使用它。

謝謝。

回答

0

你真不該使用Class.getConstructor()與運行時類型的你想要的東西傳遞給它 - 方法工作過正式的參數。

如果您需要搜索與您擁有的某些對象相匹配的構造函數,則必須遍歷getConstructors(),檢查每個構造函數的形式參數,並檢查是否使用Class.isAssignableFrom()找到合適的簽名。我不認爲有一種方便的方法可以讓反射API爲您重載解析。

(或者,重新審視自己的方法,使與反射搞亂不再是必要的。)

0

我真的不明白的問題 - 通常不需要上溯造型。
但接縫像這個問題是讓類的對象,
如果使用getSuperclass方法:

Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass.getSuperclass()); 

文檔:getSuperclass()