2012-02-17 9 views
24

Questa potrebbe essere una domanda stupida, ma io sono nuovo a Java, in modo da ...Come si usa getConstructor (params) .newInstance (args)?

ho attualmente avuto qualche codice in cui attualmente, viene utilizzato clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance() . Ho bisogno di passare alcuni argomenti a questo, quindi voglio cambiarlo in: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args). Quello che non capisco è quello che ho bisogno di passare come param e cosa ho bisogno di passare come argomenti. Diciamo che volevo passare in una stringa "howdy" e qualche oggetto di tipo XYZ chiamato XyzObj. Come potrei specificarlo? Come potrei passare come params e cosa dovrei passare come argomenti?

risposta

38

In Java questo è chiamato Reflection.

Supponendo che la classe abbia questo costruttore, in caso contrario si otterrà un'eccezione NoSuchMethod.

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

Dal momento che sei un nuovo Java, mi permetta di darle un più facile in modo che tu possa capire cosa sta succedendo sotto il cofano quando si esegue questa operazione.

Supponete di avere la seguente classe:

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

allora si ha la seguente metodo principale:

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

Se si esegue questo si noterà il messaggio di stampa di uscita della console - ho invocato . Ciò significa che usando la reflection hai invocato il costruttore di ParentClazz.

È possibile fare la stessa cosa se lo scenario permette voi è utilizzando standard di processo di creazione degli oggetti:

ParentClazz clazz = new ParentClazz("howdy"); 

Spero che questo ti aiuta a capire che.

+2

In inglese, params è un array di la classe (i) dell'argomento (s), mentre args è una matrice dell'argomento (i) effettivo (i). – Neil

1

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

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

che presuppone che i args costruttore sono nell'ordine specificato

4

Ecco un esempio di creazione di classi senza la nuova parola chiave. Le classi prendono come parametri le altre classi primitive e Oggetti. L'esempio mostra inoltre l'istanza di una sottoclasse e una classe genitore creati

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 {} 

speranza è utile

Genere riguarda

Naresh Maharaj