反射举例
2019-04-28 本文已影响0人
UlissesJr
反射是框架的前提
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!
}
}