JAVA反射機制是什麼?

JAVA反射機制

類對象

通俗的講,類可以看做模板藍圖,是一個設計稿,類對象是一個做出來的模板,是一個模具,而對象就是用模具做出來的實例。

獲取類對象有3種方式

  1. Class.forName();
  2. Hero.class;
  3. new Hero().getClass();

在一個JVM中,一種類,只會有一個類對象存在。所以以上三種方式取出來的類對象,都是一樣的。

創建對象

// Son.java
// 注意三種方法裏面的Son.class不會觸發static代碼塊,其他兩種會觸發static,但是隻有一次。
package demo;
public class Son{
	static{
		System.out.println("execution");
	}
	public Son(int i){
		System.out.println("create"+i);
	}
	public Son() {
		System.out.println("null");
	}
	void function(){
		System.out.println("func");
	} 
}
// 使用類對象創建實例,注意getConstructor()方法只能獲取public的的構造方法。
//getDeclaredConstructor()方法可以獲取所有構造方法,getConstructor方法傳遞的參數是類對象如下所示:
Class sonClass = Son.class;
Constructor cons = sonClass.getConstructor(int.class); //這裏聲明是哪個構造函數,沒有就不要寫。
Son son = (Son)cons.newInstance(1);  //在這裏傳參數,沒有就不要寫。
//記得使用try語句接異常。

訪問屬性

訪問的屬性只能是public的,對於private修飾的成員,需要使用field.setAccessible(true)才能訪問和修改。

Field可以翻譯成字段。

/*getField和getDeclaredField的區別:這兩個方法都是用於獲取字段,getField 只能獲取public的,包括從父類繼承來的字段。getDeclaredField 可以獲取本類所有的字段,包括private的,但是不能獲取繼承來的字段。 (注: 這裏只能獲取到private的字段,但並不能訪問該private字段的值,除非加上setAccessible(true))*/

//Son.java
public class Son{
    private String name = "Ally";
}
//訪問修改屬性
Class sonClass = Son.class;
Constructor cons = sonClass.getConstructor();
Son son = (Son)cons.newInstance();
Field feild = sonClass.getDeclaredField("name");
feild.setAccessible(true); //需要這一句來獲得權限。
feild.set(son,"XXX");
System.out.println(son.getName());

調用方法

同理和上面的使用方式類似

//Son.java
public class Son{
    private void function(String str,int i){
		System.out.println(str+i);
	} 
}

Class sonClass = Son.class;
Constructor cons = sonClass.getConstructor();
Son son = (Son)cons.newInstance();
Method method = sonClass.getDeclaredMethod("function",String.class,int.class);
method.setAccessible(true);
method.invoke(son,"XXX",5);//使用invoke調用,若是靜態方法就使用Son.class

推薦一個方法:

在一個txt中寫如下的的語句

name=XXX

value=YYY

可以通過以下方法獲得鍵值對信息:

Properties springConfig= new Properties();
springConfig.load(new FileInputStream(springConfigFile));
String className = (String) springConfig.get("name");
String methodName = (String) springConfig.get("value");

這樣就實現了使用txt來控制java代碼

反射的使用

比如spring中的IOC依賴注入就經常使用這種方式,學習spring的時候就會碰到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章