iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >详解Java中Method的Invoke方法
  • 703
分享到

详解Java中Method的Invoke方法

javamethodinvoke 2023-05-31 00:05:55 703人浏览 泡泡鱼
摘要

在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错

在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错。虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码。 
Method的invoke方法 

1.先检查 AccessibleObject的override属性是否为true。

AccessibleObject是Method,Field,Constructor的父类,override属性默认为false,可调用setAccessible方法改变,如果设置为true,则表示可以忽略访问权限的限制,直接调用。

如果不是ture,则要进行访问权限检测。用Reflection的quickCheckMemberAccess方法先检查是不是public的,如果不是再用Reflection.getCallerClass(1)方法获

得到调用这个方法的Class,然后做是否有权限访问的校验,校验之后缓存一次,以便下次如果还是这个类来调用就不用去做校验了,直接用上次的结果,(很奇怪用这种方式缓存,因为这种方式如果下次换个类来调用的话,就不用会缓存了,而再验证一遍,把这次的结果做为缓存,但上一次的缓存结果就被冲掉了。这是一个很简单的缓冲机制,只适用于一个类的重复调用)。 

调用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了。

再一步深入

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: 

------------------------------------------MethodAccessor---------------------------------
假如有这么一个类A: 

public class A {  public void foo(String name) {    System.out.println("Hello, " + name);  }}

--结束END--

本文标题: 详解Java中Method的Invoke方法

本文链接: https://www.lsjlt.com/news/222391.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java中Method的Invoke方法
    在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错...
    99+
    2023-05-31
    java method invoke
  • java反射及Method的Invoke方法
    Java反射机制是指在运行时动态获取类的信息并操作类的属性、方法、构造器等。通过反射机制可以在运行时动态创建对象、调用方法、获取字段...
    99+
    2023-09-15
    Java
  • java反射之Method的invoke方法实现教程详解
    反射是Java语言的一种特性,它可以在运行时动态地获取类的信息并操作类的成员。Method类是反射机制中用于表示方法的类,在Meth...
    99+
    2023-08-17
    Java
  • 深入解析Java中反射中的invoke()方法
    先讲一下java中的反射: 反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作 反射机制应用场景:逆向代码、动态生成类框架等,使用反射机制能够大大的...
    99+
    2022-11-12
  • C# Invoke,begininvoke的用法详解
    在C#中,Invoke和BeginInvoke是用于在多线程编程中调用委托的方法。委托是一种可以存储对方法的引用的类型,可以用于异步...
    99+
    2023-08-08
    C#
  • 详解Java方法method的定义与调用及重载
    目录方法的定义和调用什么是方法方法的声明格式方法的调用方式方法的详细说明总结方法的重载什么是方法重载构成方法重载的条件总结方法的定义和调用 什么是方法 方法(method)就是一段用...
    99+
    2022-11-13
  • java中invoke方法的参数有哪些
    在Java中,invoke方法的参数有以下几种:1. 调用的对象(或者类):可以是一个实例对象或者一个类对象。2. 方法名:要调用的...
    99+
    2023-08-08
    java invoke
  • java的invoke方法怎么使用
    在Java中,invoke方法用于调用一个方法或构造函数。 invoke方法有两种使用方式: 对于普通方法的调用: Object...
    99+
    2023-10-23
    java
  • Java的invoke方法的具体使用
    如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。 invoke方法是干什...
    99+
    2022-11-13
  • java invoke方法的作用是什么
    Java中的invoke方法可以用于调用对象的方法或访问对象的属性。它可以通过反射机制在运行时动态地调用对象的方法或访问对象的属性,...
    99+
    2023-10-19
    java
  • C#中Invoke的用法讲解
    C#中Invoke的用法() invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些...
    99+
    2022-11-12
  • 关于C#中的Invoke示例详解
    目录C# 关于Invoke什么时候用?为什么要用1、Control的Invoke2、Delegate的Invoke怎么用?1、Control 的 Invoke2、Delegate的I...
    99+
    2023-02-06
    c#的invoke c#中invoke方法详解 c# Invoke
  • spring bean标签中的init-method和destroy-method详解
    目录1 背景介绍2 init-method3 destroy-method4 总结1 背景介绍 在很多项目中,经常在xml配置文件中看到init-method 或者 destroy-...
    99+
    2023-05-16
    spring  init-method和destroy-method spring bean标签 spring bean init-method
  • Java方法method的定义、调用及重载方法
    这篇文章主要介绍“Java方法method的定义、调用及重载方法”,在日常操作中,相信很多人在Java方法method的定义、调用及重载方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java方法metho...
    99+
    2023-06-30
  • Java中Date方法详解
    先进行专栏介绍 本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。希望能对大家能有所帮助,同时也是请大家对我进行监督,对我写的代码进行建议,互相学习。 Date方法 Da...
    99+
    2023-08-16
    java 开发语言
  • InvocationHandler中invoke()方法的调用问题分析
    Java中动态代理的实现,关键就是这两个东西:Proxy、InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的。首先,invoke方法的完整形式如下...
    99+
    2023-05-30
    java invoke 调用
  • Java中的==使用方法详解
    目录Java中的==2 字符串常量池3 总结Java中的== Java中的==表示的是什么呢?有时候很令人费解。比如,以下例子输出是什么? // 例一 String st...
    99+
    2022-11-12
  • Java中ArrayList的removeAll方法详解
    本文介绍的是关于Java中ArrayList的removeAll方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:在开发过程中,遇到一个情况,就是从所有骑手Id中过滤没有标签的骑手Id(直接查询没有标签的骑手不容易实现),L...
    99+
    2023-05-31
    java arraylist removeall
  • 详解JAVA中的构造方法
    目录 一、构造方法的概念 二、构造方法的特性 一、构造方法的概念         构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时由编译器自动调用,并且在整个对象的生命周期内只调用一次。 代码演示:...
    99+
    2023-09-07
    java
  • Java线程中的sleep方法详解
    在Java线程中,sleep方法是一个线程的静态方法,用于暂停当前线程的执行一段时间。sleep方法的语法如下:```javapub...
    99+
    2023-09-14
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作