java中常用的设计模式有哪些没有探索,没有灵魂!
Java反射及动态代理
详细讲解java的reflect包的,阐述反射机制及动态代理的细节问题.其中动态代理部分内容参考网上资料.读完此文,相信会对java反射机制有一个完整清楚的了解.尤其应该看看其它中代码举例部分.
若有疑问<ymkyve501@gmail>
目录
Type及其子类 2
Type在java.lang中的使用 2
返回Type的方法 2
Type在flect中的使用 2
Type子接口 2
返回Type的方法 2
Java反射 2
对象创建过程 2
反射过程 2
Class对象 2
反射代码举例 2
动态代理 2
代理模式 2
代理模式代码举例 2
Java动态代理机制 2
代理机制及其特点 2
代码是最好的老师 2
代理类实现推演 2
美中不足 2
动态代理代码举例 2
Type及其子类
Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
public interface Type {
}
以此来理解java中的类型
Type在java.lang中的使用
java.lang 中 Type 的使用 |
实现 Type 的 java.lang 中的类 | |
class | Class<T> Class 类的实例表示正在运行的 Java 应用程序中的类和接口。 |
返回Type的方法
返回 Type 的 java.lang 中的方法 | |
Type[] | Class.getGenericInterfaces() 返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。 |
Type | Class.getGenericSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。 |
Type在flect中的使用
flect 中 Type 的使用 |
Type子接口
flect 中 Type 的子接口 | |
interface | GenericArrayType GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。 |
interface | ParameterizedType ParameterizedType 表示参数化类型,如 Collection<String>。 |
interface | TypeVariable<D extends GenericDeclaration> TypeVariable 是各种类型变量的公共高级接口。 |
interface | WildcardType WildcardType 表示一个通配符类型表达式,如 ?、? extends Number 或 ? super Integer。 |
返回Type的方法
返回 Type 的 flect 中的方法 | |
Type[] | ParameterizedType.getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。 |
Type[] | TypeVariable.getBounds() 返回表示此类型变量上边界的 Type 对象的数组。 |
Type | GenericArrayType.getGenericComponentType() 返回表示此数组的组件类型的 Type 对象。 |
Type[] | Constructor.getGenericExceptionTypes() 返回一组 Type 对象,这些对象表示声明要由此 Constructor 对象抛出的异常。 |
Type[] | Method.getGenericExceptionTypes() 返回 Type 对象数组,这些对象描述了声明由此 Method 对象抛出的异常。 |
Type[] | Constructor.getGenericParameterTypes() 按照声明顺序返回一组 Type 对象,这些对象表示此 Constructor 对象所表示的方法的形参类型。 |
Type[] | Method.getGenericParameterTypes() 按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。 |
Type | Method.getGenericReturnType() 返回表示由此 Method 对象所表示方法的正式返回类型的 Type 对象。 |
Type | Field.getGenericType() 返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型。 |
Type[] | WildcardType.getLowerBounds() 返回表示此类型变量下边界的 Type 对象的数组。 |
Type | ParameterizedType.getOwnerType() 返回 Type 对象,表示此类型是其成员之一的类型。 |
Type | ParameterizedType.getRawType() 返回 Type 对象,表示声明此类型的类或接口。 |
Type[] | WildcardType.getUpperBounds() 返回表示此类型变量上边界的 Type 对象的数组。 |
Java反射
准确理解反射,应该理解类的加载过程及Class相关的东西
这里大概讲一下类的加载过程
比如说要new一个对象,会是如下步骤
对象创建过程
a. 在可知的路径下查是否存在该类文件
b. 使用相应的ClassLoader加载类文件(可以参考JVM详细和JVM类加载两篇文章)
c. 加载.class文件时,会初始化static部分
d. 分配相应的内存空间来存储相关数据
e. 内存空间清零(即获得默认值)
f. 构造基类(只有基类构造完成,才能构造子类)
g. 初始化成员
h. 构造该类的对象
反射过程
反射机制中Class类是一个入口和核心
1. 得到该类对应的Class对象
2. 由类的Class对象产生该类的实例(利用构造器)
3. 由类的Class对象动态得到类的属性和方法
4. 运行时动态调用对象的任意属性和方法
5. 运行时动态产生一个对象的代理对象
反射机制主要使用的类
Java.lang.Class
flect.Method
flect.Filed
flect.Construtor
以下是完整的反射包
Class对象
得到该类对应的Class对象三种方式:
1. Class.forName(“类的完整字符串名字")
2.类名.class
3.对象.getClass()
代表了load到内存中的Class对象
Object的getClass()可以拿到该类对象(=类名.class)
Class的getClassLoader可以拿到装载这个class的ClassLoader
反射代码举例
动态代理
Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解。本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现。
代理模式
代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好
地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。
代理模式代码举例
Java动态代理机制
要了解 Java 动态代理的机制,首先需要了解以下相关的类或接口:
∙ flect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。
清单 1. Proxy 的静态方法
清单 1. Proxy 的静态方法
// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器 static InvocationHandler getInvocationHandler(Object proxy) // 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象 static Class getProxyClass(ClassLoader loader, Class[] interfaces) // 方法 3:该方法用于判断指定类对象是否是一个动态代理类 static boolean isProxyClass(Class cl) // 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例 static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) |
∙ flect.InvocationHandler:这是调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。
清单 2. InvocationHandler 的核心方法
清单 2. InvocationHandler 的核心方法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论