2012-02-17 16 views
24

To może równie dobrze być głupie pytanie, ale jestem nowy w Javie, więc ...Jak korzystać z getConstructor (params) .newInstance (args)?

Ja obecnie mam niektóre kodu gdzie obecnie clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance() jest używany. Muszę przekazać kilka argumentów, więc chcę go zmienić na: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args). To, czego nie rozumiem, to to, co muszę przekazać jako parametry i co muszę przekazać jako argumenty. Powiedzmy, że chciałem przekazać ciąg "howdy" i jakiś obiekt typu XYZ o nazwie XyzObj. Jak to określić? Co bym przekazał jako parametry i co bym przekazał jako argumenty?

Odpowiedz

38

w Javie To się nazywa Reflection.

Zakładając, że klasa ma ten konstruktor, w przeciwnym razie dostanę wyjątek NoSuchMethod.

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

Ponieważ jesteś nowy w Javie, podam łatwiejszy, aby można było zrozumieć, co się dzieje pod maską, kiedy to zrobić.

Załóżmy masz następujące klasy:

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

Wtedy masz następujące główne metody:

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

Jeśli uruchomić to można zauważyć wiadomość druku wyjście konsola - Zostałem wywołany . Oznacza to, że używając refleksji, wywołałeś konstruktora ParentClazz.

Można zrobić to samo, czy scenariusz pozwala to za pomocą standardowego procesu tworzenia obiektów:

ParentClazz clazz = new ParentClazz("howdy"); 

nadzieję, że pomoże Ci to zrozumieć.

+2

W angielskim params jest tablicą Klasa (-y) argumentu (ów), podczas gdy args jest tablicą rzeczywistych argumentów. – Neil

1

byłoby użyć clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj);

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

która zakłada, że ​​argumenty konstruktora są w podanej kolejności

4

Oto przykład tworzenia zajęć bez nowego słowa kluczowego. Klasy przyjmują inne klasy zarówno prymitywów, jak i Obiekty jako ich parametry. Przykład pokazuje też wystąpienie podklasy i klasa nadrzędna tworzone

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

nadzieję, że jest użyteczny

Rodzaj odniesieniu

NARESH Maharaja

Powiązane problemy