Java的反射弧机制和动态代理.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java的反射弧机制和动态代理

网络应用Java 的反射弧机制和动态代理 运行时信息(RunTime Type Information,RTTI)使得你可以在程序 运行时发现和使用类型信息。RTTI 主要用来运行时获取向上转型之后 的对象到底是什么具体的类型。 Class 对象 JAVA 使用Class 对象来执行RTTI。每个类都有一个Class 对象, 它用来创建这个类的所有对象,反过来说,每个类的所有对象都会关联 同一个Class 对象(对于数组来说,维数、类型一致的数组的Class 对 象才是相同的),每个对象的创建都依赖于Class 对象的是否创建,Class 对象的创建发生在类加载(java.lang.ClassLoader)的时候。 Java.lang.Class 类实现了Serializable、GenericDeclaration、Type、 AnnotatedElement 四个接口,分别实现了可序列化、泛型定义、类型、 元数据(注解)的功能。可以把Class 对象理解为一个类在内存中的接口 代理(它代理了这个类的类型信息、方法签名、属性),JVM 加载一个类 的时候首先创建Class 对象,然后创建这个类的每个实例的时候都使用 这个Class 对象。 Class 只有一个私有的无参构造方法,也就是说Class 的对象创建 只有JVM 可以完成。如何验证同一个类的多个对象的Class 对象是一 个呢?我们知道==用来比较应用是否相等(也就是同一个引用),应为 Class 对象在JVM 中只有一个,所以Class 对象是否相等是JAVA 对象 中唯一可以使用==判断的。 如何获取Class 对象 所有的引用数据类型(l 类-类型)的类名、基本数据类型都可以通 过.class 方式获取其Class 对象,通过这种方式获取class 对象就做类 的字面常量; Class 的forName(String name)传入一个类的完整路径也可以获得 Class 对象,但由于使用的是字符串,必须强制转换才可以获取泛型的 ClassT的Class 对象,并且你可以获取这个方法可能抛出的 ClassNotreFoundException 异常。 对于应用数据类的引用(必须初始化),可以通过Object 类继承的 getClass()方法获取这个引用的Class 对象,由于引用已经被初始化, 所以这种方式也不会初始化静态域,因为静态域已经被初始化过。另外, 前面两种方式如果说是创建Class 对象,那么这种方式应该是取得 Class 对象,因为类的实例已经被创建,那么Class 对象也一定早就被 创建。 JAVA 的反射机制 前面说过RTTI 获取某个对象的确切类型,要求在这个对象在编译 时已知,也就是必须已经在你的代码中存在完整的声明,但是如果是运 行时才会知晓的对象(例如,网络中传递过来的字节),RTTI 就没有 办法工作了。 java.lang.class 与java.lang.reflect.* 包中的类提供了有别于 RTTI(编译器在编译时打开和检查*.class 文件)的反射机制(运行时打开 和检查*.class 文件)。JAVA 的反射机制功能相当强大。 Java 的动态代理 JAVA 自带的动态代理是基于java.lang.reflect .Proxy、 java.lang.reflect.InvocationHandler 两个类来完成的,使用JAVA 反射 机制。 通常使用下面方法创建代理对象: Object proxy = Proxy.newProxyInstance(定义代理对象的类加载 器, 要代理的目标对象的归属接口数 组, 回调接口InvocationHandler); JDK 的动态代理会动态的创建一个$Proxy0 的类,这个类继承了 Proxy 并且实现了要代理的目标对象的接口,但是在JDK 中是找不到这 个类的,因为它是动态生成的。 public final class $Proxy0 extends Proxy implements 目标对象的接口 1,接口2,…{ //构造方法 Public $Proxy0(InvocationHandler h){ … … } } 我们用下面的图说明

文档评论(0)

ayangjiayu3 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档