Java反射是框架设计的灵魂。
现在利用反射原理编写个简单框架:
需求:
1.不通过new一个对象,实现调用类的函数方法
2.写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
实现:
1. 配置文件
2. 反射
步骤:
1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2. 在程序中加载读取配置文件
3. 使用反射技术来加载类文件进内存
4. 创建对象
5. 执行方法
一、编写两个class类,Teacher和Student(方便调用)
Teacher
package Reflect;
public class Teacher {
public void teach() {
System.out.println("teach...");
}
}
Student
package Reflect;
public class Student{
public void study() {
System.out.println("study...");
}
}
二、编写配置文件pro.properties(以前都是在其它函数里new一个对象,直接调用,都是硬编码写死了,现在要通过配置文件改变调用类的函数方法)
className代表的是类名
methodName代表的是方法名
#className=Reflect.Teacher
#methodName=teach
className=Reflect.Student
methodName=study
三、利用反射实现简单框架
(1)利用Java中的properties函数创建properties对象
(2)ClassLoad加载class目录下所有文件
(3)classLoader.getResourceAsStream()路径一定要准确,否者加载不到,返回null或加载错误,默认路径是class下,如果不在就填写相对class路径
(4)获取配置文件中的信息
(5)利用Java反射基础——四大核心类Class、Constructor、Method、Field实现获取类名,执行方法
package Reflect;
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. 在程序中加载读取配置文件
3. 使用反射技术来加载类文件进内存
4. 创建对象
5. 执行方法
*/
//1、加载配置文件
//1.1、创建Properties对象
Properties pro=new Properties();
//1.2、加载配置文件,转换为一个集合
//1.2.1、获取class目录下的配置文件
ClassLoader classLoader=reflectTest.class.getClassLoader();
//默认class path路径,返回字节流
InputStream is=classLoader.getResourceAsStream("Reflect/pro.properties");
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);
}
}
结果图:
调用Student
调用Teacher
总结:一个简单的例子,本来两个new对象就可以实现,结果写了这么多,是不是很繁琐没用,其实正是因为这个框架太小体现不出来,当项目写的十分庞大时,要是硬编码的话,修改、维护、移植都很麻烦,但是有了框架,就只需修改简单的地方就可以达到想要的目的
例如:项目中数据库操作,总不可能每个需要操作的类都创建一个connection连接数据库,例如SSM框架使用配置数据库jdbc.properties文件一劳永逸