反射机制概述
Class是描述类的类 (对象可以由类来描述, 类可以由Class类来描述)
理解Class类并获取Class实例
疑问?
通过直接new的方式或反射的方式都可以调用公共的结构, 开发中到底用哪个?
直接new的方式. 什么时候回使用: 反射的方式. 反射的特征: 动态性. 如果能确定new哪个类的对象就用new, 如果在程序执行过程中才能确定的话, 就用反射
反射机制与面向对象中的封装性是不是矛盾的? 如何看待两个技术?
不矛盾. 封装性体现在, 设置为private的不建议使用, public的建议使用, 所以才会把字段,方法设置成private, 认为调用者没有必要调用private修饰的. 但是使用反射可以强制去调用
关于java.lang.Class类的理解
- 类的加载过程:
程序经过javac.exe命令以后, 会生成一个或多个字节码文件(.class结尾),
接着我们使用java.exe命令对某个字节码文件进行解释运行. 相当于将某个字节码文件加载到内存中, 此过程成为类的加载. 加载到内存中的类, 我们就成为运行时类, 此运行时类, 就作为Class的一个实例- 换句话说, Class的实例就对应着一个运行时类.
- 我们加载到内存中的运行时类, 会缓存一定时间. 再此时间之内, 我们可以通过不同的方式来获取此运行时类.此时通过获取Class实例的4种方式获取的同一个类的Class实例都是同一个, 他们的地址也相同
获取Class的实例的方式
Class实例可以是那些结构的说明:
类的加载与ClassLoader的理解
创建运行时类的对象
获取运行时类的完整结构
获取属性
获取属性中的结构
获取方法
获取方法中的结构
获取构造器结构
获取运行时类的带泛型父类
普通父类
带泛型父类
获取带泛型父类的泛型
获取运行时类实现的接口
获取运行时类所在的包
调用运行时类的指定结构
调用属性
调用public的属性,通常不采用此方法
调用非public的属性, 这个需要掌握
调用静态属性, 就把上面那个p换成任意对象, 甚至写null都行
调用运行时类指定的方法
调用非静态方法
调用静态方法
Person.class可以换成别的,甚至换成null都可以
调用运行时类指定的构造器
反射的应用: 动态代理
静态代理的举例
特点: 代理类和被代理类在编译期间, 就确定下来了
动态代理举例
在被代理类的方法执行前, 代理类新增加的代码, 需要写在下面类的invoke()中
动态代理与AOP