c#, Python都是动态语言,可以在运行时改变自身结构。而反射是Java非常重要的动态特性
思考:方法变量化是不是也是一种动态性的体现?
理解Class类并获取Class类的实例
Class的实例就对应一个运行时类
1 | //方式一:调用运行时类的属性:.classs |
补充一点,后续学到编译内容是再更新。
类的加载过程
Load=>Link=>Initialize
Load:将class文件读入内存,并在堆里为之创建一个java.lang.Class对象。此过程由类加载器完成。
Link:将类的二进制数据合并到JRE中
Initialize: JVM负责对类进行初始化
创建运行时类的对象
反射机制应用最多的地方来了!
创建类的对象:调用Class对象的newInstance()方法
要求类必须有一个无参构造器,类的构造器访问权限要足够。
1 | Class clazz = Person.class; |
没有无参的构造器也可以创建对象,调用类中的指定构造器
1 | Class clazz = Class.forName("aa.Java.Person"); |
调用运行时类的指定结构
调用指定属性
1 | Class clazz = Person.class; |
调用指定方法同理
实例化class==>找到方法==>调用方法invoke()
使用频率更高。
1 | Class clazz = Person.class; |
调用指定构造器
已经在创建运行时类的对象部分介绍过。
反射的应用–动态代理
补充:静态代理,以设计模式中的工厂模式做例,实际上是多态性的体现。
碎碎念,到处都存在的多态性和解耦合操作。
分别有三个对象,提供一个接口,代理类和被代理类。代理类通过聚合的方式调用接口,被代理类实现接口中的目标方法。从而利用多态特点,代理类调用被代理类实现的目标方法。听起来比较绕口,就举个例子。
1 | class ProxyClothFactory implements ClothFactory{ |
动态代理内容有待补充。后续更新。