Java反射

来源:互联网 发布:淘宝卖假的隐形眼镜 编辑:程序博客网 时间:2024/05/18 18:44

理解class类

对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成

获取 Class 对象的方式

这里写图片描述

Class类的常用方法

方法名 功能说明 static Class forName(String name) 返回指定类名 name 的 Class 对象 Object newInstance() 调用缺省构造函数,返回该Class对象的一个实例 Object newInstance(Object []args) 调用当前格式构造函数,返回该Class对象的一个实例 getName() 返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称 Class getSuperClass() 返回当前Class对象的父类的Class对象 Class [] getInterfaces() 获取当前Class对象的接口 ClassLoader getClassLoader() 返回该类的类加载器 Class getSuperclass() 返回表示此Class所表示的实体的超类的Class

反射

反射概述

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
在运行时构造任意一个类的对象
在运行时获取任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法(属性)
生成动态代理

在运行时构造一个类的对象

调用 Class 对象的 newInstance() 方法
调用 Constructor 对象的 newInstance(Object… initargs)

Method(Field) 对象

代表方法
Class 对象获取 Method 的方法:

getDeclaredMethod(String name, Class <?> ... parameterTypes) getDeclaredMethods() getMethod(String name, Class <?> ... parameterTypes) getMethods() Method 对象的方法:invoke(Object obj, Object... args) 

Annotation 相关

以 Method 为例:
获取 Annotation 实例:
getAnnotation(Class annotationClass)
getDeclaredAnnotations()
getParameterAnnotations()

创建动态代理

Proxy 提供用于创建动态代理类和代理对象的静态方法, 它也是所有动态代理类的父类.
Proxy 提供了两个方法来创建动态代理类和动态代理实例

使用动态代理实现 AOP

横切关注点: 跨越应用程序多个模块的功能
代码实现片段
这里写图片描述
问题:

  1. 越来越多的非业务需求(日志和验证)加入后, 原有的计算器方法急剧膨胀.

  2. 属于系统范围内的需求通常需要跨越多个模块(横切关注点), 这些类似的需求包括日志, 验证, 事务等

  3. 代码混乱: 每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点.
  4. 代码分散: 以日志需求为例, 只是为了满足这个单一需求, 就不得不在多个模块里多次重复相同的日志代码. 如果日志需求发生变化, 必须修改所有模块.

使用动态代理模块化横切关注点

这里写图片描述
代码实现
第一张
这里写图片描述
第二张
这里写图片描述
测试代码
第一张
这里写图片描述
第二张
这里写图片描述
第三张
这里写图片描述

原创粉丝点击