Java 反射對象創(chuàng)建

2018-02-12 20:30 更新

Java反射 - Java反射對象創(chuàng)建


我們可以使用反射動態(tài)創(chuàng)建類的對象。通過調用其中一個構造函數(shù)。

然后我們可以訪問對象的字段的值,設置它們的值,并調用它們的方法。

有兩種方法來創(chuàng)建對象:

  • 使用no-args構造函數(shù)
  • 使用帶參數(shù)的構造函數(shù)

無參數(shù)構造函數(shù)

如果你有一個 Class 對象的引用,你可以創(chuàng)建一個對象該類對Class類使用 newInstance()方法。

此方法不使用參數(shù),并且是等效的使用new運算符的類的no-args構造函數(shù)。

MyClass m  = myObject.newInstance();
class MyClass {
  public MyClass() {
     System.out.println("called");
  }
}
public class Main {
  public static void main(String[] args) throws InstantiationException {
    Class<MyClass> personClass = MyClass.class;
    try {
      MyClass p = personClass.newInstance();
      System.out.println(p);
    } catch (InstantiationException | IllegalAccessException e) {
      System.out.println(e.getMessage());
    }
  }
}

上面的代碼生成以下結果。


帶參數(shù)的構造函數(shù)

您可以通過調用特定的構造函數(shù)使用反射創(chuàng)建對象。它涉及兩個步驟。

  • 獲取構造函數(shù)的實例
  • 調用newInstance來調用它

你可以得到這個構造函數(shù)的引用,如圖所示:

Constructor<MyClass> cons  = myClass.getConstructor(int.class, String.class);

然后調用帶有參數(shù)的 newInstance()方法來創(chuàng)建一個對象。

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

class MyClass {
  public MyClass(int i, String s) {
    System.out.println("called");
    System.out.println(i);
    System.out.println(s);
  }
}
public class Main {
  public static void main(String[] args) {
    Class<MyClass> myClass = MyClass.class;
    try {
      Constructor<MyClass> cons = myClass.getConstructor(int.class,
          String.class);
      MyClass chris = cons.newInstance(1, "abc");
      System.out.println(chris);
    } catch (NoSuchMethodException | SecurityException | InstantiationException
        | IllegalAccessException | IllegalArgumentException
        | InvocationTargetException e) {
      System.out.println(e.getMessage());
    }
  }
}

上面的代碼生成以下結果。

調用方法

我們可以通過方法引用使用反射調用方法。

要調用方法,請調用方法引用的 invoke()方法。

它的第一個參數(shù)是它來自和的對象第二個參數(shù)是同一順序中所有參數(shù)的varargs作為方法的聲明。

在靜態(tài)方法的情況下,我們只需要為第一個參數(shù)指定null。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class MyClass {
  public MyClass() {
  }

  public void setName(String n) {
    System.out.println(n);
  }
}

public class Main {
  public static void main(String[] args) {
    Class<MyClass> myClass = MyClass.class;
    try {
      MyClass p = myClass.newInstance();
      Method setName = myClass.getMethod("setName", String.class);
      setName.invoke(p, "abc");
    } catch (InstantiationException | IllegalAccessException
        | NoSuchMethodException | SecurityException | IllegalArgumentException
        | InvocationTargetException e) {
      System.out.println(e.getMessage());
    }
  }
}

上面的代碼生成以下結果。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號