1.反射機制概念
反射機制是指在運行狀態中,對於任意一個類都能知道這個類的所有屬性和方法,並且對於 任意一個對象,都能調用它的任意一個方法。這種動態獲取信息以及動態調用對象方法的功能成爲Java語言的反射機制。
2.應用場景
如果編譯時根本無法預知該對象和類屬於哪些類,程序只能依靠運行時信息來發現該對象
和類的真實信息,此時就必須使用到反射了。
3.反射相關的API
- Class 類:反射的核心類,可以獲取類的屬性,方法等信息。
- Field 類:Java.lang.reflect包中的類,表示類的成員變量,可以用來獲取和設置類之中的屬性值。
- Method 類: Java.lang.reflect包中的類,表示類的方法,它可以用來獲取類中的方法信息或者執行方法。
- Constructor 類: Java.lang.reflect包中的類,表示類的構造方法。
- Parameter類:構造方法Constructor 或者方法Method 中的參數信息。
4.反射使用的步驟
- 獲取要操作的類的Class對象。
- 使用反射Api可獲取Class的構造方法、方法、屬性等。
5.獲取Class的有三種方法
- 調用某個對象的getClass()方法
Person p = new Person();
Class personClass = p.getClass();
- 調用某個類的 class 屬性來獲取該類對應的 Class 對象
Class personClass = Person.class;
3.使用 Class 類中的 forName()靜態方法(最安全/性能最好)
Class personClass = Class.forName("com.huang.reflect.Person");
示例:
Class personClass = Class.forName("com.huang.reflect.Person");
//獲取Person中的所有屬性
Field[] fields = personClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("field--name=="+field.getName());
}
//獲取Person中的所有構造方法
Constructor[] constructors = personClass.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println("constructor--name=="+constructor.getName());
//獲取構造方法中的參數
Parameter[] parameters = constructor.getParameters();
for (Parameter parameter : parameters) {
System.out.println("constructor--"+constructor.getName()+"--parameter--"+parameter.toString());
}
}
//獲取Person中的所有方法
Method[] methods = personClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.toString());
Parameter[] parameters = method.getParameters();
for (Parameter parameter : parameters) {
System.out.println("method--"+method.getName()+"--parameter--"+parameter.toString());
}
}
注:getDeclaredX是獲取當前Class中申明的所有X,getX是獲取當前Class以及父類或者接口定義的public的x
6.創建對象的兩種方法
1.Class對象的newInstance()方法,這種方法要求該Class對象對應的類有默認的空構造器。
2.調用Constructor對象的newInstance()方法,先使用Class對象獲取指定Constructor對象,再調用 Constructor 對象的 newInstance()方法來創建 Class 對象對應類的實例,通過這種方法可以選定構造方法創建實例。
Class personClass = Class.forName("com.huang.reflect.Person");
//1.使用newInstance方法創建對象,空的構造方法
Person p = (Person) personClass.newInstance();
//2.使用構造方法創建對象
Constructor c = personClass.getDeclaredConstructor(String.class,int.class,String.class);
Person p1 = (Person) c.newInstance("xiaohong",20,"女");