Java反射:框架设计的灵魂
- 框架:办成品软件,可以在框架的基础上进行开发
- 反射:将类的各个部分封装成对象,这就是反射机制
反射的好处
- 在程序运行的过程中,操作这些对象
- 可以降低程序的耦合性,提高程序的可扩展性
获取class对象的方式
- Class.forName(“全类名”):经字节码文件加载进内存,返回class对象
- 多用于配置文件,将类名定义在配置文件中,读取文件,加载类
- 类名.class:通过类名的属性class获取
- 多用于参数传递
- 对象.getClass():getClass()方法在Object方法中定义
- 多用于对象的获取字节码的方式
- 同一个字节码文件(*.class)在一次程序运行过程中,只被加载一次
不论通过哪一种方式获取的Class文件都是同一个
package reflect;
import domain.Person;
public class ReflectPerson {
public static void main(String[] args) throws Exception {
//Class.forName("全类名")
Class cls1 = Class.forName("domain.Person");
System.out.println(cls1);
//类名.class
Class cls2 = Person.class;
System.out.println(cls2);
//对象.getClass()
Person p = new Person();
Class cls3=p.getClass();
System.out.println(cls3);
//比较三个对象
System.out.println(cls1==cls2);//true
System.out.println(cls1==cls3);//true
}
}
Class对象的功能
获取功能
- 获取成员变量们
- 获取构造方法们
- 获取成员方法们
- 获取类名
实例
写一个“框架”,可以帮我们创建任意类的对象,并且执行其中任意方法
- 步骤:
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 在程序中加载读取配置文件
- 使用反射技术来加载类文件进内存
- 创建对象,执行方法
配置文件
//className=cn.itcast.Person
//methodName=eat
className=cn.itcast.Student
methodName=sleep
执行代码
package cn.itcast.test;
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.加载配置文件
//1.1创建Properties文件
Properties pro = new Properties();//创建properties对象
//1.2加载配置文件,转换成一个集合
//1.2.1获取Class目录下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("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);
}
}