2011-10-19 15 views
1

私は二つのクラスUpObjとDownObjJava。アップキャストタイプのリフレクションはどのように使用できますか?

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(); 
     } 

    } 

} 

を持って、私は、発信者のコンストラクタで親UpObjに私の子供の型DownObjをアップキャストします。 これはヘルプのジェネリックで可能だと思います。このようなもの 。 誰でもこの使い方を正確に知っています。

ありがとうございました。

答えて

0

実際にClass.getConstructor()を実行時の型に渡すべきではありません。正式なパラメータは、このメソッドで渡されます。

いくつかのオブジェクトに一致するコンストラクタを検索する必要がある場合は、getConstructors()をループし、各コンストラクタの仮パラメータを調べ、Class.isAssignableFrom()を使用して適切なシグネチャが見つかったかどうかを確認します。リフレクションAPIに解像度をオーバーロードさせる便利な方法はないと思います。

(あるいは、その反射をいじりはもはや必要ではあなたのアプローチを再考しない)

0

私は実際に問題を理解していない - アップキャストは、通常必要とされていません。
が、問題は、オブジェクトの上位クラスを取得することであるようにそれは縫い目、
getSuperclassメソッドを使用する場合:

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

ドキュメント:getSuperclass()

関連する問題