- 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中Method的Invoke方法
1 / 14 Java 中 Method 的 Invoke 方法 在写代码的时候,发现从父类 class 通过 getDeclaredMethod 获取的 Method 可以调用子类的对象,而子类改写了这 个方法,从子类 class 通过 getDeclaredMethod 也能获取到 Method,这时去调用父类的对象也会报错。虽然这是很符合 多态的现象,也符合 java 的动态绑定规范,但还是想弄懂 java 是如何实现的,就学习了下 Method 的源代码。 Method 的 invoke 方法 1.先检查 AccessibleObject 的 override 属性是否为 true。 AccessibleObject 是 Method,Field,Constructor 的父类,override 属性默认为 false,可调用 setAccessible 方法改变,如 果设置为 true,则表示可以忽略访问权限的限制,直接调用。 2.如果不是 ture,则要进行访问权限检测。用 Reflection 的 quickCheckMemberAccess 方法先检查是不是 public 的,如果 不是再用 Reflection.getCallerClass(1)方法获 得到调用这个方法的 Class,然后做是否有权限访问的校验,校验之后缓存一次,以便下次如果还是这个类来调用就不用去做 校验了,直接用上次的结果,(很奇怪用这种方式缓存,因为这种方式如果下次换个类来调用的话,就不用会缓存了,而再 验证一遍,把这次的结果做为缓存,但上一次的缓存结果就被冲掉了。这是一个很简单的缓冲机制,只适用于一个类的重复 调用)。 3.调用 MethodAccessor 的 invoke 方法。每个 Method 对象包含一个 root 对象,root 对象里持有一个 MethodAccessor 对象。我们获得的 Method 独享相当于一个 root 对象的镜像,所有这类 Method 共享 root 里的 MethodAccessor 对象,(这 个对象由 ReflectionFactory 方法生成,ReflectionFactory 对象在 Method 类中是 static final 的由 native 方法实例化)。 ReflectionFactory 生成 MethodAccessor:如果 noInflation 的属性为 true 则直接返回 MethodAccessorGenerator 创建 的一个 MethodAccessor。否则返回 DelegatingMethodAccessorImpl,并将他与一个 NativeMethodAccessorImpl 互 相引用。但 DelegatingMethodAccessorImpl 执行 invoke 方法的时候又委托给 NativeMethodAccessorImpl 了。 再一步深入 4.NativeMethodAccessorImpl 的 invkoe 方法: 调用 natiave 方法 invoke0 执行方法调用. 注意这里有一个计数器 numInvocations,每调用一次方法+1,当比 ReflectionFactory.inflationThreshold(15)大的时候,用 MethodAccessorGenerator创建一个MethodAccessor,并把之前的DelegatingMethodAccessorImpl引用替换为现在新 创建的。下一次 DelegatingMethodAccessorImpl 就不会再交给 NativeMethodAccessorImpl 执行了,而是交给新生成 的 java 字节码的 MethodAccessor。 MethodAccessorGenerator 使用了 asm 字节码动态加载技术,暂不深入研究。 总结 一个方法可以生成多个 Method 对象,但只有一个 root 对象,主要用于持有一个 MethodAccessor 对象,这个对象 也可以认为一个方法只有一个,相当于是 static 的。因为 Method 的 invoke 是交给 MethodAccessor 执行的,所以我所想 要知道的答案在 MethodAccessor 的 invoke 中,深入 MethodAccessor: 2 / 14 ------------------------------------------MethodAccessor--------------------------------- 假如有这么一个类 A: pu
您可能关注的文档
- HONDA公司微型燃气涡喷发电机.pdf
- Hot water freeze quickly good for share.ppt
- How a Secure and Open Mobile Agent Framework Suits Electronic Commerce Applications.pdf
- Honeywell (Modules+Specification).pdf
- How do the grains slide in fine-grained zirconia polycrystals at high temperature.pdf
- How developers copy.pdf
- How e-commerce is transforming and internationalizing service industries.pdf
- How good is the turbid medium-based app.pdf
- How novel are the chemical weapons of garlic mustard in North American forest understories.pdf
- How Does The Bone Shaft Geometry Affect its Bending Properties.pdf
最近下载
- 安徽蓝盾 YDZX-01型烟气系统操作手册.pdf VIP
- 宠物除臭剂项目立项报告.pptx VIP
- 2024年履行合同催告函(6篇).pdf VIP
- CFD软件:Star-CCM+ 二次开发_(9).Star-CCM+后处理与可视化二次开发.docx VIP
- CFD软件:Star-CCM+ 二次开发_(8).Star-CCM+物理模型与求解器二次开发.docx VIP
- CFD软件:Star-CCM+ 二次开发_(7).Star-CCM+网格生成与优化二次开发.docx VIP
- CFD软件:Star-CCM+ 二次开发_(6).Star-CCM+二次开发API基础.docx VIP
- CFD软件:Star-CCM+ 二次开发_(5).Star-CCM+脚本编写与调试.docx VIP
- CFD软件:Star-CCM+ 二次开发_(4).Star-CCM+二次开发环境搭建.docx VIP
- CFD软件:Star-CCM+ 二次开发_(3).Star-CCM+数据结构与对象模型.docx VIP
文档评论(0)