天天看點

JAVA的反射機制學習筆記(二)

             上次寫JAVA的反射機制學習筆記(一)的時候,還是7月22号,這些天就瞎忙活了。自己的步伐全然被打亂了~不能繼續被動下去。得又一次找到自己的節奏。

4、擷取類的Constructor

通過反射機制得到某個類的構造器,然後調用該構造器建立該類的一個執行個體 

Class<T>類提供了幾個方法擷取類的構造器。

public Constructor<T>

getConstructor(Class<?

>...

parameterTypes)

傳回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公共構造方法

public Constructor<?>[]

getConstructors()

傳回一個包括某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的全部公共構造方法

getDeclaredConstructor(Class<?

傳回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構造方法

getDeclaredConstructors()

傳回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的全部構造方法。它們是公共、保護、預設(包)訪問和私有構造方法

5、建立類的執行個體

通過反射機制建立新類的執行個體,有幾種方法能夠建立

調用無自變量ctor

1、調用類的Class對象的newInstance方法。該方法會調用對象的預設構造器,假設沒有預設構造器。會調用失敗.

Class<?> classType = ExtendType.class;

Object inst = classType.newInstance();

System.out.println(inst);

輸出:

Type:Default Constructor

ExtendType:Default Constructor

com.quincy.ExtendType@d80be3

2、調用預設Constructor對象的newInstance方法

Class<?

> classType = ExtendType.class;

Constructor<?

> constructor1 = classType.getConstructor();

Object inst = constructor1.newInstance();

com.quincy.ExtendType@1006d75

調用帶參數ctor

3、調用帶參數Constructor對象的newInstance方法

> constructor2 =

classType.getDeclaredConstructor(int.class, String.class);

Object inst = constructor2.newInstance(1, "123");

ExtendType:Constructor with parameters

com.quincy.ExtendType@15e83f9

>[] constructors2 = clazzDog.getDeclaredConstructors();

for (Constructor<?

> m : constructors2)

{

System.out.println(m);

>[] types = m.getParameterTypes();

for (Class<?

> type : types) {

System.out.println(type);

}

System.out.println("-----------------new instance-------------------");

Constructor constructor = clazzDog.getDeclaredConstructor(String.class,int.class);

Dog dog = (Dog)constructor.newInstance("換換",2);

System.out.println(dog.name);

6、調用類的函數

通過反射擷取類Method對象。調用Field的Invoke方法調用函數。

7、設定/擷取類的屬性值

通過反射擷取類的Field對象,調用Field方法設定或擷取值

Class clazzDog = Dog.class;

Object object = clazzDog.newInstance();

Field field = clazzDog.getDeclaredField("name");

field.set(object, "歡歡");

System.out.println(((Dog)object).name);