JavaSE

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.java

    class Cat{
    private String name;
    public Cat(){}
    public hi(){}
    }

    经过Javac编译生成Cat.class文件
    Cat.class

    Cat.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.生成动态代理

三、反射在项目中的应用案例

留言