反射是框架的前提
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 {
//下面說說傳統的做法 1.先創建對象-->實例化 2.調用方法
/**
* 下面這種方法有一個弊端,框架應該是一個半成品的軟件。前提是,不能改變框架里面的任何代碼,也可以創建任意類
* 的對象,可以執行任意方法。
*/
Person p = new Person();
p.eat();
//可以創建任意類的對象,可以執行任意方法
//1.加載配置文件
//1.1創建properties對象
Properties pro = new Properties();
//1.2加載配置文件,把他轉換成一個集合
//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.獲取配置文件中定義的數據
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//3.加載該類進內存
Class cls = Class.forName(className);
//4.創建對象 調用無參構造
Object obj = cls.newInstance();
//5.獲取方法對象
Method method = cls.getMethod(methodName);
//6.執行方法
method.invoke(obj);//eat food!
}
}