2012-02-17 33 views
24

Đây có thể là một câu hỏi ngu ngốc, nhưng tôi mới sử dụng Java, vì vậy ...Làm cách nào để sử dụng getConstructor (params) .newInstance (args)?

Tôi hiện đang có một số mã, hiện tại đang sử dụng clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance() . Tôi cần phải vượt qua một số lý lẽ cho điều này, vì vậy tôi muốn thay đổi nó thành: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args). Những gì tôi không hiểu là những gì tôi cần phải vượt qua như là params và những gì tôi cần phải vượt qua như args. Hãy nói rằng tôi muốn vượt qua trong một String "howdy" và một số đối tượng của loại XYZ được gọi là XyzObj in Làm thế nào tôi sẽ xác định điều đó? Tôi sẽ làm gì để chuyển qua các tham số và tôi sẽ chuyển như những gì?

Trả lời

38

Trong Java này được gọi là Reflection.

Giả sử rằng lớp này có hàm tạo này, nếu không bạn sẽ nhận được ngoại lệ NoSuchMethod mà tôi tin.

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

Vì bạn mới sử dụng Java, hãy để tôi cung cấp cho bạn một cách dễ dàng hơn để bạn có thể hiểu những gì đang xảy ra dưới mui xe khi bạn thực hiện việc này.

Giả sử bạn có lớp sau đây:

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

Sau đó, bạn có phương pháp chủ yếu sau đây:

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

Nếu bạn chạy này, bạn sẽ thấy thông điệp in giao diện điều khiển đầu ra - Tôi đã được gọi . Điều này có nghĩa rằng việc sử dụng sự phản chiếu bạn đã viện dẫn hàm tạo của ParentClazz.

Bạn có thể làm điều tương tự nếu kịch bản cho phép bạn là bằng cách sử dụng quá trình tạo đối tượng tiêu chuẩn:

ParentClazz clazz = new ParentClazz("howdy"); 

Hy vọng điều này sẽ giúp bạn hiểu nó.

+2

Trong tiếng Anh, params là một mảng (các) Lớp của đối số, trong khi arg là một mảng của (các) đối số thực tế. – Neil

1

Bạn sẽ sử dụng clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj);

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

Những giả định rằng các args constructor là theo trình tự quy định

4

Dưới đây là ví dụ về tạo lớp mà không có từ khóa mới. Các lớp học lấy các lớp khác cả primitives và Objects làm tham số của chúng. Ví dụ này cũng cho thấy sự thể hiện của một lớp con và một lớp chuyên được tạo ra

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

Hy vọng điều này rất hữu ích

Kind coi

Naresh Maharaj

Các vấn đề liên quan