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

2018-02-12 20:30 更新

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


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

然后我們可以訪問對(duì)象的字段的值,設(shè)置它們的值,并調(diào)用它們的方法。

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

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

無參數(shù)構(gòu)造函數(shù)

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

此方法不使用參數(shù),并且是等效的使用new運(yùn)算符的類的no-args構(gòu)造函數(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());
    }
  }
}

上面的代碼生成以下結(jié)果。


帶參數(shù)的構(gòu)造函數(shù)

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

  • 獲取構(gòu)造函數(shù)的實(shí)例
  • 調(diào)用newInstance來調(diào)用它

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

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

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

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());
    }
  }
}

上面的代碼生成以下結(jié)果。

調(diào)用方法

我們可以通過方法引用使用反射調(diào)用方法。

要調(diào)用方法,請(qǐng)調(diào)用方法引用的 invoke()方法。

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

在靜態(tài)方法的情況下,我們只需要為第一個(gè)參數(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());
    }
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)