Java深入解析Method的Invoke方法
版权申诉
5星 · 超过95%的资源 119 浏览量
更新于2024-09-13
1
收藏 131KB PDF 举报
"详解Java中Method的Invoke方法以及其工作原理"
在Java编程中,`Method`的`invoke`方法是一个非常关键的特性,它允许我们在运行时动态地调用对象的方法。这个方法使得Java具备了动态绑定的能力,是实现多态性的一个重要工具。以下是对`Method.invoke`方法的深入解析。
1. **`Method.invoke`的基本概念**
`Method.invoke(Object obj, Object... args)`方法用于在指定的对象上执行此`Method`对象所表示的方法。第一个参数`obj`是目标对象,即要调用方法的对象;第二个参数`args`是传递给方法的参数列表。
2. **检查与权限控制**
在调用`invoke`之前,首先会检查`Method`的`AccessibleObject`属性`override`。默认情况下,这个属性是`false`。如果设置为`true`,表示可以忽略访问权限限制,直接调用。如果为`false`,系统会进行访问权限检测,确保调用者具有调用该方法的权限。
3. **权限检测流程**
- 如果方法不是公共的,`Reflection`类的`quickCheckMemberAccess`方法会先检查方法是否是公共的。如果不是,它会使用`Reflection.getCallerClass(1)`获取调用`invoke`方法的类,并进行权限校验。这个校验结果会被缓存,以便于后续同类型调用时快速判断。
4. **`MethodAccessor`的使用**
- 每个`Method`对象都有一个`root`对象,其中包含了`MethodAccessor`。当我们获取到一个`Method`时,其实我们得到的是`root`对象的一个镜像,所有此类`Method`共享`root`中的`MethodAccessor`。
- `MethodAccessor`是用于实际执行方法调用的接口,由`ReflectionFactory`生成。`ReflectionFactory`是`Method`类中的静态常量,通过原生(`native`)方法实例化。
- 如果`noInflation`属性为`true`,则直接返回`MethodAccessor`,这通常是为了性能优化,避免了方法调用的膨胀(例如,通过字节码解释)。
5. **方法调用的实现**
- `MethodAccessor.invoke`是执行方法调用的真正入口。它根据不同的场景,如是否是本地方法(`native`)、是否是静态方法等,选择不同的策略进行调用。对于非本地方法,`MethodAccessor`通常会通过反射或者字节码操作来执行实际的方法调用。
6. **多态性与动态绑定**
这个过程体现了Java的多态性和动态绑定特性。当从父类`Class`获取到的`Method`调用子类对象时,实际执行的是子类中重写的方法。这是因为Java在运行时会根据对象的实际类型而非引用类型来决定调用哪个方法,这就是所谓的动态绑定。
`Method.invoke`方法在Java中扮演着至关重要的角色,它允许我们在运行时灵活地调用对象的方法,是理解Java动态性与面向对象设计的关键之一。在编写涉及反射或动态代理的代码时,对`Method.invoke`的工作原理有深入理解是非常必要的。
2020-08-18 上传
2012-06-26 上传
2019-03-11 上传
2021-11-17 上传
2020-09-03 上传
点击了解资源详情
2020-08-29 上传
2020-09-03 上传
2020-08-26 上传
weixin_38637764
- 粉丝: 10
- 资源: 953
最新资源
- nanonote:一种简约的笔记应用程序
- IT-manuale-del-software-developer:软件开发人员指南
- TrackingDoc-crx插件
- C_Repository:C ++代码
- tsv2vcf-开源
- pandas_gbq_magic-1.1.2.tar.gz
- apollo-ps3:阿波罗保存工具(PS3)
- snews v1.7.1 英文版
- rmt:SUSE Customer Center的RPM存储库镜像工具和注册代理
- my_vim:我的vimrc
- RebootInBot
- dmnmgr-client:DMN管理器-具有附加功能的DMN编辑器,例如验证,模拟和基本git支持
- pandas_genomics-0.12.0.tar.gz
- 参考资料-基于STC单片机的电动客车空调控制系统设计.zip
- 金蝶虚拟机补丁-编码:#13397609虚拟机补丁.zip
- ToyChat-开源