反射机制与动态代理

it2024-05-07  47

反射机制概述

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

最新回复(0)