2012-02-17 8 views
24

これは十分に愚かな質問かもしれないが、私は、Javaに新たなんだ、そう...私は現在、現在、clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance() が使用されているいくつかのコードを持っているgetConstructor(params).newInstance(args)はどのように使用しますか?

。私はこれにいくつかの議論を渡す必要があるので、それをclazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)に変更したいと思います。私が理解できないことは、私がparamsとして渡す必要があるものと、argsとして渡す必要があるものです。私は文字列 "howdy"とXyzObjという型のXYZ型のオブジェクトを渡したいとしましょう。どうすれば指定できますか?私は何をparamsとして渡すのですか?そしてargsとして私は何を渡しますか?

答えて

38

になっていることを前提としていclazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj);

+2

に関してparamsはargsは実際の引数の配列ですが、引数のクラス(複数も可) – Neil

1

あなたは、コンストラクタの引数が、これはReflectionと呼ばれるJavaでは、指定された順序

3
clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj) 

を使用します。

クラスにこのコンストラクタがあると仮定すると、それ以外の場合はNoSuchMethod例外が発生します。

clazz.asSubclass(asSubclassOfClass) 
    .getConstructor(String.class,XYZ.class) 
    .newInstance("howdy",XyzObj); 

は、Javaに新しいですので、あなたはこれを行う際にボンネットの下に何が起こっているのかを理解することができるように私はあなたに簡単にを与えてみましょう。

あなたは以下のクラスがあるとします。

public class ParentClazz{ 
     String someVar; 
    public ParentClazz(){ 
     someVar="test"; 
    } 
    public ParentClazz(String someVar){ 
     System.out.println("I have been invoked"); 
     this.someVar=someVar; 
    } 
} 

その後、あなたは次の主な方法があります:

public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
      ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy"); 
    } 

あなたがこれを実行する場合は、コンソール出力の印刷メッセージに気づくでしょう - 私が呼び出されたが。つまり、リフレクションを使用すると、ParentClazzのコンストラクタが呼び出されたことになります。シナリオはあなたが標準的なオブジェクト作成プロセスを使用していることができます場合は、同じことを行うことができます

ParentClazz clazz = new ParentClazz("howdy"); 

が、これはあなたがそれを理解するのに役立ちます願っています。

4

ここでは、newキーワードなしでクラスを作成する例を示します。 これらのクラスは、プリミティブとオブジェクトの両方を他のクラスと見なします。 例も、これは有用

あるホープ

public class ConstructorInstantiateWithoutNew 
{ 
    @SuppressWarnings("rawtypes") 
    public static void main(String [] args) 
    { 
     Class<Drinker> clazz_drinker = Drinker.class; 
     Class [] paramTypes = { Fizz.class, Colour.class, int.class }; 
     Object [] paramValues = { new Fizz(), new Colour(), new Integer(10) }; 

     Class<Drunk> clazz_drunk = Drunk.class; 
     Class [] paramTypesSub = { Fizz.class, Colour.class, int.class, boolean.class }; 
     Object [] paramValuesSub = { new Fizz(), new Colour(), new Integer(10), true }; 

     try 
     { 
      Drinker drinker = clazz_drinker.getConstructor(paramTypes).newInstance(paramValues); 
      drinker.drink(); 

      Drunk drunk = clazz_drunk.getConstructor(paramTypesSub).newInstance(paramValuesSub); 
      drunk.drink(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

class Drinker 
{ 
    int n; 

    public Drinker(Fizz f, Colour c, int n) 
    { 
     this.n = n; 
    } 

    public void drink() 
    { 
     System.out.println("Dad drank " + (n*10) + " ml"); 
    } 
} 

class Drunk extends Drinker 
{ 
    boolean trouble; 
    public Drunk(Fizz f, Colour c, int n, boolean inDogHouse) 
    { 
     super(f,c,n); 
     trouble = inDogHouse; 
    } 

    public void drink() 
    { 
     System.out.println( 
       "Dad is Grounded: " + trouble + 
       " as he drank over "+ 
       (n*10) + " ml"); 
    } 
} 

class Fizz {} class Colour {} 

のサブクラスのインスタンスを示し、親クラスが作成されている種類は、の配列であり、英語で

ネアシュマハラジ

関連する問題