JAVA Reflection
Reflection是被視爲動態語言的關鍵,反射機制允許程序在執行期藉助於Reflection API取得任何類的內部信息,並能直接操作任意對象的內部屬性及方法
JAVA反射機制提供的功能:
在運行時判斷任意一個對象所屬的類
在運行時構造任意一個類的對象
在運行時判斷任意一個類所具有的成員變量和方法
在運行時調用任意一個對象的成員變量和方法
生成動態代理
1.理解Class類並實例化Class類對象
2.運行時創建類對象並獲取類的完整結構
3.通過反射調用類的指定方法、指定屬性
4.動態代理
反射相關的API:
java.lang.Class : 代表一個類
java.lang.reflect.Method:代表類的方法
java.lang.reflect.Field :代表類的成員變量
java.lang.reflect.Constructor:代表類的構造方法
代碼:
Person類:
package reflect;
public class Person {
public String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println("我是一箇中國人");
}
public void display(String national){
System.out.println("我的國家是" + national);
}
}
測試類:
package reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
/*
* 面向對象的思想創建對象併爲屬性賦值
* */
System.out.println("面向對象的思想創建對象併爲屬性賦值");
Person person = new Person();
person.setName("張蕾");
person.setAge(20);
System.out.println(person);
person.show();
person.display("中國");
System.out.println("***********************");
/*
* 通過反射實現,通過反射創建一個類的對象,並調用其中的結構
* */
//1.創建classPerson運行時類Person類的對象
Class<Person> classPerson = Person.class;
Person p = (Person)classPerson.newInstance();
System.out.println("反射的" + p);
//2.通過反射調用運行時類的指定的屬性
Field f1 = classPerson.getField("name");//此時要把name屬性public的
f1.set(p, "ZhangLei");
System.out.println("通過反射添加public的name屬性後的Person對象:" + p);
Field f2 = classPerson.getDeclaredField("age");//此時要把name屬性public的
//getDeclaredField("age")是暴力反射
f2.setAccessible(true);//加上這句就不會報錯:java.lang.IllegalAccessException
f2.set(p, 22);
System.out.println("通過反射添加private的age屬性後的Person對象:" + p);
//3.通過反射調用運行時類的指定的方法
Method m1 = classPerson.getMethod("show");//第一個參數是要調用的方法的名稱,第二個參數是形參的類型的類,沒有就不寫
m1.invoke(p);//第一個參數是對象,第二個參數是方法的實參,沒有就不寫
Method m2 = classPerson.getMethod("display", String.class);
m2.invoke(p,"China");
}
}
測試結果: