上次寫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);