反射是框架的前提
1.配置文件 pro.properties
className = anli.Person
methodName = eat
2.Person類
package anli;
public class Person {
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void eat(){
System.out.println("eat food!");
}
public void eat(String food){
System.out.println("eat food!" + food);
}
}
3.反射
package anli;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/**
* 框架類
*/
public class ReflectTest {
public static void main(String[] args) throws Exception {
//下面說說傳統(tǒng)的做法 1.先創(chuàng)建對象-->實例化 2.調(diào)用方法
/**
* 下面這種方法有一個弊端暴凑,框架應(yīng)該是一個半成品的軟件峦甩。前提是,不能改變框架里面的任何代碼现喳,也可以創(chuàng)建任意類
* 的對象凯傲,可以執(zhí)行任意方法。
*/
Person p = new Person();
p.eat();
//可以創(chuàng)建任意類的對象嗦篱,可以執(zhí)行任意方法
//1.加載配置文件
//1.1創(chuàng)建properties對象
Properties pro = new Properties();
//1.2加載配置文件冰单,把他轉(zhuǎn)換成一個集合
//1.2.1獲取class目錄下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
System.out.println(classLoader);//jdk.internal.loader.ClassLoaders$AppClassLoader@512ddf17
InputStream is = classLoader.getResourceAsStream("pro.properties");
System.out.println(is);//java.io.BufferedInputStream@511baa65
pro.load(is);
//2.獲取配置文件中定義的數(shù)據(jù)
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//3.加載該類進(jìn)內(nèi)存
Class cls = Class.forName(className);
//4.創(chuàng)建對象 調(diào)用無參構(gòu)造
Object obj = cls.newInstance();
//5.獲取方法對象
Method method = cls.getMethod(methodName);
//6.執(zhí)行方法
method.invoke(obj);//eat food!
}
}