JAVA反射機制
類對象
通俗的講,類可以看做模板藍圖,是一個設計稿,類對象是一個做出來的模板,是一個模具,而對象就是用模具做出來的實例。
獲取類對象有3種方式
- Class.forName();
- Hero.class;
- 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的時候就會碰到。