JAVA反射机制(个人笔记)

上传人:飞****9 文档编号:129345772 上传时间:2020-04-22 格式:PDF 页数:9 大小:451.17KB
返回 下载 相关 举报
JAVA反射机制(个人笔记)_第1页
第1页 / 共9页
JAVA反射机制(个人笔记)_第2页
第2页 / 共9页
JAVA反射机制(个人笔记)_第3页
第3页 / 共9页
JAVA反射机制(个人笔记)_第4页
第4页 / 共9页
JAVA反射机制(个人笔记)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《JAVA反射机制(个人笔记)》由会员分享,可在线阅读,更多相关《JAVA反射机制(个人笔记)(9页珍藏版)》请在金锄头文库上搜索。

1、在在 Java 运行时环境中 对于任意一个类 能否知道这个类有哪些属性和方法 对于任意一运行时环境中 对于任意一个类 能否知道这个类有哪些属性和方法 对于任意一 个对象 能否调用它的任意一个方法 答案是肯定的 这种动态获取类的信息以及动态调个对象 能否调用它的任意一个方法 答案是肯定的 这种动态获取类的信息以及动态调 用对象的方法的功能来自于用对象的方法的功能来自于 Java 语言的反射 语言的反射 Reflection 机制 机制 在运行时判断任意一个对象所属的类 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员

2、变量和方法 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法在运行时调用任意一个对象的方法 Reflection 是是 Java 被视为动态 或准动态 语言的一个关键性质 这个机制允许程序在运被视为动态 或准动态 语言的一个关键性质 这个机制允许程序在运 行时透过行时透过 Reflection APIs 取得任何一个已知名称的取得任何一个已知名称的 class 的内部信息 包括其的内部信息 包括其 modifiers 诸 诸 如如 public static 等等等等 superclass 例如 例如 Object 实现之 实现之 interfaces 例如 例如

3、Serializable 也包括也包括 fields 和和 methods 的所有信息 并可于运行时改变的所有信息 并可于运行时改变 fields 内容或调用内容或调用 methods 一般而言一般而言 开发者社群说到动态语言开发者社群说到动态语言 大致认同的一个定义是大致认同的一个定义是 程序运行时程序运行时 允许改变程允许改变程 序结构或变量类型 这种语言称为动态语言序结构或变量类型 这种语言称为动态语言 从这个观点看 从这个观点看 Perl Python Ruby 是动态是动态 语言 语言 C Java C 不是动态语言不是动态语言 在在 JDK 中 主要由以下类来实现中 主要由以下类来

4、实现 Java 反射机制 这些类都位于反射机制 这些类都位于 java lang reflect 包中包中 Class 类 代表一个类 Field 类 代表类的成员变量 成员变量也称为类的属性 Method 类 代表类的方法 Constructor 类 代表类的构造方法 Array 类 提供了动态创建数组 以及访问数组的元素的静态方法 任何一个对象都有一个和它相对应的 Class 对象描述该对象的属性 方法等信息 通过 getClass 获取 Field fields classtype getDeclaredFields Method methods classtype getDeclare

5、dMethods public static void main String args throws ClassNotFoundException Class classobj ainstance getClass 这是另一种获取ainstance对象对应的Class 类型对象 A ainstance new A Class classtype Class forName whl reflection A Field fields classtype getDeclaredFields Method methods classtype getDeclaredMethods System ou

6、t println length fields length for int i 0 i fields length i Field field fields i String fieldName field getName Method method methods i String methodName method getName System out println 属性 i fieldName System out println 方法 i methodName 当一个当一个 class 被加载 或当加载器 被加载 或当加载器 class loader 的 的 defineClass

7、 被被 JVM 调用 调用 JVM 便自动便自动 产生一个产生一个 Class object 因为因为 Class 并没有并没有 public constructor Class 是是 Reflection 起源 针对任何您想探勘的起源 针对任何您想探勘的 class 唯有先为它产生一个 唯有先为它产生一个 Class object 接 接 下来才能经由后者唤起为数十多个的下来才能经由后者唤起为数十多个的 Reflection APIs 第第 26 Class object 的取得途径 Java 允许我们从多种途径为一个允许我们从多种途径为一个 class 生生 成对应的成对应的 Class

8、object 生成对象实例 1 不带参数 通过 Class 对象 newInstance 方法生产对象实例 运行时生成 instances 动态生成 Class object 所对应之 class 的 对象实体 无自变量 2 带参数 通过 Constructor 对象调用 newInstance arg 方法 生成对象实例 向上转型和多态 向上转型和多态 由于最近很长一段时间忙于他事 对 java 的有些机制的概念的理解模糊了些 甚至有些遗 忘了 现在终于可以转入正轨 今天在读一段代码时 看到了如下的情况 由于公司保密要 求 故不泄露具体函数名称和实现细目 只暴露我遇见的问题 Interfac

9、eA abstract void f class B implements A void f body body end public calss c public static void main String args B b new B A a A b a f 我当时的问题是 当 A a A b 时 b 发生了向上转型行为 故此时 b 被窄化 此时 reference a持 有的对象应该只有其父接口中的函数有效 这是没有异议的 那么 当 main 中发生的调用 a f 被执行时 真正唤起的函数式抽象函数 f 还是 B 中的 f 经过参阅资料和我自己的验证 得到的结论是 a f 最终唤醒了

10、 B 中的 f 通过思考和继续学习 我得到了如下的认识 1 向上转型 发生在编译期 子类被窄化后在型别上被视为其超类 窄化后在原 子类中但不在其超类中的函数失效 但由其超类继承而来的接口依然可以被唤起 2 子类向上转型后 其通过继承并覆写后的函数仍能被唤起 并能被准确识别及执 行 即向上转型后的对象 其内有效的函数别调用时 能准确执行其自身未转型时的功能 这个机制主要由 java 函数 非 final 函数 的 后期邦定 性质保障 3 这个机制的优越处在于 当父类的一个接口函数被不同子类继承并覆写后 当个 个子类通过向上转型时 只要唤醒父类接口 java 虚拟机会自动准确的识别出究竟该调用 那

11、个具体的子类函数 4 后期邦定依靠于执行期型别识别 这个概念我将于以后做出补充 5 以上就是所谓的多态的一部分内容 目前 我所了解到的多态带来的意义是 开发变得容易些了 当很多不同的类要执行只有细小差别的功能的同名函数时 可 以提供一个接口并暴露接口函数 那个细小差别函数的同名函数 作为公共接口函数 其他 不同的类可以继承并覆写那个接口 调用时 只需将这些类的对象向上转型 调用该接口即 可 java 机制会保证调用准确 这样做使得代码量减小 可读性提高 学习java三个基本点 1 class对象与元数据 每个具体的类都有一个class抽象类的子类 从class中可以得到该类的所有信息 如接口

12、方法 基类等信息 具体类的class类是否就是该类的元数据 且元数据在具体类如String类加载的时候它也加载了 newString 的时候元数据也加载了 且是实例的一个属性 问题是 具体的class是否就是对应类的元数据 且在对象加载时也加载元数据 2 RTTI 运行时类型识别如何实现 向上转型或向下转型时 如果错误就会抛出类型出错 即有一种RTTI机制 保证引用都准确的指向正确的对象 问题是 那怎么判断转型正确 难道是调用class对象根据它的元数据来识别 因为class对象可以得到当前实例的直接基类等信息 通过它一级级得到是否转型正确 3 单根继承与垃圾回收 看到不少文章都说 单根继承与

13、对象在堆上保存的机制保证了垃圾回收机制 问题是 对象在堆上保存是基础 单根继承与垃圾回收的联系在哪里 单根继承只是垃圾回收机制的一小部份 它确保所有类都可以在垃圾回收时调用一些函数 其它的 作用不太清楚了 我觉得是不是RTTI机制或元数据才是垃圾回收的另一关键 因为要找到没有引用的对象即垃圾空间 通过查找哪些对象没有被引用 首先找一个有引用的对象 然后再查找该对象里有哪些对象 这些都是可用的对象 其它则是垃圾 对象 这种机制好像又是通过它的元数据来取得类型本身的一些信息来达到的 代理模式 代理模式 在某些情况下 一个客户不想或者不能直接引用另一个对象 而代理对象可以在客户端和目 标对象之间起到

14、中介的作用 代理模式一般涉及到的角色有 抽象角色 声明真实对象和代理对象的共同接口 代理角色 代理对象角色内部含有对真实对象的引用 从而可以操作真实对象 同时代 理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象 同时 代理对象 可以在执行真实对象操作时 附加其他的操作 相当于对真实对象进行封装 真实角色 代理角色所代表的真实对象 是我们最终要引用的对象 由以上代码可以看出由以上代码可以看出 客户实际需要调用的是客户实际需要调用的是 RealSubject 类的类的 request 方法方法 现在用现在用 ProxySubject 来代理来代理 RealSubject 类 同样达到目

15、的 同时还封装了其他方法类 同样达到目的 同时还封装了其他方法 preRequest postRequest 可 可 以处理一些其他问题 以处理一些其他问题 另外另外 如果要按照上述的方法使用代理模式如果要按照上述的方法使用代理模式 那么真实角色必须是事先已经存在的那么真实角色必须是事先已经存在的 并将其作为并将其作为 代理对象的内部属性 但是实际使用时 一个真实角色必须对应一个代理对象的内部属性 但是实际使用时 一个真实角色必须对应一个 代理角色 如果大量使用代理角色 如果大量使用 会导致类的急剧膨胀会导致类的急剧膨胀 此外此外 如果事先并不知道真实角色如果事先并不知道真实角色 该如何使用代

16、理呢 这个问题可以通该如何使用代理呢 这个问题可以通 过过 Java 的动态代理类来解决的动态代理类来解决 Method invoke 方法 方法 通过通过 Class 对象生成对象生成 class 对象 并调用其方法对象 并调用其方法 Object result addMethod invoke InvokeTest new Object Hello addMethod 是 InvokeTest 对象的方法对象 Method new Object Hello 传入参数 Result 就是执行 InvokeTest 对象中的方法 add 返回结果 package com langsin reflection import java lang reflect Method public class InvokeTester public int add int param1 int param2 return param1 param2 public String echo String msg return echo msg public static void main String

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号