Java反射機(jī)制
在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法桩了;這種動(dòng)態(tài)獲取的以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為Java的反射機(jī)制。
比如:下面的通過(guò)配置文件來(lái)創(chuàng)建一個(gè)類(lèi)攒庵,然后根據(jù)配置文件的方法來(lái)執(zhí)行這個(gè)方法的這個(gè)例子
re.properties
classfullpath=com.hspedu.Cat
method=cry
public class Cat {
private String name = "招財(cái)貓";
public int age = 10; //public的
public Cat() {} //無(wú)參構(gòu)造器
public Cat(String name) {
this.name = name;
}
public void hi() { //常用方法
//System.out.println("hi " + name);
}
public void cry() { //常用方法
System.out.println(name + " 喵喵叫..");
}
}
public class ReflectionQuestion {
public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//根據(jù)配置文件 re.properties 指定信息, 創(chuàng)建Cat對(duì)象并調(diào)用方法hi
//老韓回憶
//傳統(tǒng)的方式 new 對(duì)象 -》 調(diào)用方法
// Cat cat = new Cat();
// cat.hi(); ===> cat.cry() 修改源碼.
//我們嘗試做一做 -> 明白反射
//1. 使用Properties 類(lèi), 可以讀寫(xiě)配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("D:\\cache\\re.properties"));
String classfullpath = properties.get("classfullpath").toString();//"com.hspedu.Cat"
String methodName = properties.get("method").toString();//"hi"
System.out.println("classfullpath=" + classfullpath);
System.out.println("method=" + methodName);
//2. 創(chuàng)建對(duì)象 , 傳統(tǒng)的方法校摩,行不通 =》 反射機(jī)制
//new classfullpath();
//3. 使用反射機(jī)制解決
//(1) 加載類(lèi), 返回Class類(lèi)型的對(duì)象cls
Class cls = Class.forName(classfullpath);
//(2) 通過(guò) cls 得到你加載的類(lèi) com.hspedu.Cat 的對(duì)象實(shí)例
Object o = cls.newInstance();
System.out.println("o的運(yùn)行類(lèi)型=" + o.getClass()); //運(yùn)行類(lèi)型
//(3) 通過(guò) cls 得到你加載的類(lèi) com.hspedu.Cat 的 methodName"hi" 的方法對(duì)象
// 即:在反射中,可以把方法視為對(duì)象(萬(wàn)物皆對(duì)象)
Method method1 = cls.getMethod(methodName);
//(4) 通過(guò)method1 調(diào)用方法: 即通過(guò)方法對(duì)象來(lái)實(shí)現(xiàn)調(diào)用方法
System.out.println("=============================");
method1.invoke(o); //傳統(tǒng)方法 對(duì)象.方法() , 反射機(jī)制 方法.invoke(對(duì)象)
}
}