Java反射
一、反射入门
一个需求引出反射
1.根据配置文件 re.properties,创建Cat对象并调用方法hi
classfullpath=com.ssmpro.Cat
method=hi
2.这个需求在学习框架的时候特别多,即通过外部文件配置,在不修改源码的情况下控制程序,符合设计模式的ocp原则(开闭原则)
class ReflectionTest{
public static void main(String []arg){
//1.使用Properties类,来读写配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src:\\re.properties");
String classfullpath = properties.get("classfullpath").toString(); //"com.ssmpro.Cat"
String methodName = properties.get("method").toString();//"hi'
Sytem.out.println("classfullpath="+classfullpath);
Sytem.out.println("classfullpath="+classfullpath);
//2.加载类,返回Class类型的对象cls
Class cls = Class.forName(classfullpath);
//3.通过cls得到加载类"com.ssmpro.Cat"的对象实例
Object o = cls.newInstance();
System.out.println("o的运行类型是"+o.getClass()); //运行类型
//4.通过cls得到加载的类 "com.ssmpro.Cat" 的 methodName "hi" 对象
//在反射中,可以把方法视为对象
Method method1 = cls.getMethod(methodName);
//5.通过method1调用方法:即通过方法对象来实现调用方法
method1.invoke(o); //传统方法 对象.方法,反射机制 方法.invoke(对象)
}
}
反射机制原理
1.反射机制允许程序在执行期借助于RefletionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等),并能操作对象的树形和方法,反射在设计模式和框架底层都会用到
2.加载完类之后,在堆中就会产生一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息,通过这个对象得到了类的整体结构,所以称为反射。
Java程序在计算机的三个阶段
-
代码编译阶段
Cat.javaclass Cat{ private String name; public Cat(){} public hi(){} }
经过Javac编译生成Cat.class文件
Cat.classCat.class字节码文件 private String name public Cat(){} public hi(){}
-
Class类阶段(加载阶段)
Cat.class文件通过类加载器ClassLoader产生Class类对象Class类对象/堆 成员变量 Filed[] filed 构造器 Constructor[] con 成员方法 Method[] me
-
Runtime运行阶段
Cat cat = new Cat(); cat.hi();
二、反射相关类
反射机制
反射机制可以完成
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时得到任意一个类所具有的成员变量和方法
4.在运行时调用任意一个对象的成员变量和方法
5.生成动态代理