- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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){
… …
}
}
我们用下面的图说明
您可能关注的文档
- 2015初级职称经济法基础精讲班 第1章总论 第1节法律基础.pdf
- 2015国考行测暑期每日一练第一周言语理解与表达:词语搭配多积累.doc
- 2015伟星股份年报.pdf
- 2015年WITOWN政策 - 市代.pdf
- 2015年中央财经大学招生计划考研专业课431金融学综合考研专业课考研真题考研考试科目.pdf
- 2015年注册会计师考试《经济法》前言.pdf
- 2015民法背多分(无密码版).pdf
- 2015注会《税法》讲义_005_0104_j.pdf
- 2016人大法学院刑法学考博历年真题报录比答题技巧参考书考试内容-育明考研考博.pdf
- 2016年CPA《会计》学习笔记-第四章长期股权投资及合营安排07.pdf
文档评论(0)