1. 程式人生 > >java基礎——反射基礎知識

java基礎——反射基礎知識

動態代理在專案中應用的比較多,動態代理是依靠反射技術來實現的,今天就來系統的學習一下反射。

java中提供的反射機制是說執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。

java反射的主要實現類:

java.lang.Class:表示正在執行的java應用程式中的類和介面,提供得到Construtor、Field、Method的方法。 java.lang.reflect.Constructor:提供關於類的單個構造方法的資訊以及對它的訪問許可權。 java.lang.reflect.Field:提供關於類或介面的屬性資訊,以及對它的動態訪問許可權。 java.lang.reflect.Method:提供關於類或介面中某個方法的資訊。 下面通過程式碼來學習:
	//獲取Class類物件
	Class class1 = Person.class;
	
	Class class2 = Class.forName("com.ls.Person");
	
	Person person = new Person();
	Class class3 = person.getClass();
	//建立物件例項
	Person person = (Person)Class.forName("com.ls.Person").newInstance();
	//獲取屬性
	//返回此 Class 物件表示的類或介面的所有可訪問公共欄位
	Field[] fields = Class.forName("com.ls.Person").getFields();
	//返回 Class 物件所表示的類或介面所宣告的所有欄位。包括公共、保護、預設(包)訪問和私有欄位,但不包括繼承的欄位
	Field[] fields2 = Class.forName("com.ls.Person").getDeclaredFields();
	//返回 Class 物件所表示的類或介面的指定已宣告欄位
	Field field3 = Class.forName("com.ls.Person").getDeclaredField("age");
	//返回Class 物件所表示的類或介面的指定公共成員欄位
	Field field4 = Class.forName("com.ls.Person").getField("name");
	
	for (int i = 0; i < fields.length; i++) {
		System.out.println(fields[i].getName());
	}
	
	for (int i = 0; i < fields2.length; i++) {
		System.out.println(fields2[i].getName());
	}
	
	//啟用和禁用訪問安全檢查的開關。預設為false。值為 true表示反射的物件在使用時應該取消 Java 語言訪問檢查
	field3.setAccessible(true);
	System.out.println(field3.get(person));
	System.out.println(field4.get(person));

	//獲取方法
	Method method = Class.forName("com.ls.Person").getMethod("getName", null);
	Method method2 = Class.forName("com.ls.Person").getMethod("setName", String.class);
	System.out.println(method.invoke(Class.forName("com.ls.Person").newInstance(), null));
	System.out.println(method2.invoke(Class.forName("com.ls.Person").newInstance(), "柳鬆"));
以上程式碼基於Person類:
class Person {
	public String name = "ls";
	private String age = "18";
	
	public Person(){}
	
	public Person(String name,String age){
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	
	public String setName(String name) {
		return name;
	}
}
綜上,可以理解為反射就是把java類中的各種成分對映成相應的java類,即一個類以及類中的變數、方法、建構函式、包等資訊,都可以當成一個物件來處理,分別對應jdk中相應的類:Class、Field、Method、Construction、Package等。