Java的invoke方法

2023-10-26

如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。

invoke方法是干什么的?有什么具体用途?

首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。

invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。

但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有一句话Java没有反射,那么很多框架都不会存在。

我们经常new 对象出来,但是new的前提是你知道你到底需要什么对象,你才能new,然而不管是代码还是现实生活都有未知性,也就是直到程序运行时受条件限制才知道什么类,什么方法。

反射解决的这个问题,运行时获取对象结构,调用方法。
Method这个类就是关于反射调用方法的
下图是Method类的官方注解
在这里插入图片描述
大概意思就是说提供类或者接口的方法信息,就可以访问调用对应的方法。

invoke的意思上就有调用的意思,也就是说我们可以通过反射包下的Method类调用invoke方法,调用我们所提供的方法以及调用方法的参数来完成动态调用。

也就是根据你给的对象/实例,方法名,以及参数来调用。找了个“替身”来帮你调用方法。

2 invoke方法的使用
实际上invoke方法的使用,和我们常见的有所区别。

我们经常创建一个对象A,A对象里面的方法getA()方法,然后A.getA()

我们采用新的方式调用
(1)弄一个方法的“替身”(其实就是构建一个Method对象,让这个Method对象来代替你现在要用的方法)
(2)然后给替身需要的对象和参数,让替身去替你调用(像JOJO的替身替你去战斗)

具体代码演示如下:

public class InvokeTest {
    public void test(String[] arg){
        for (String string : arg) {
            System.out.println("zp is " + string);
        }
    }
    @Test
    public void invokeDemo() throws Exception {
        //获取字节码对象,这里要填好你对应对象的包的路径
        Class<InvokeTest> clazz = (Class<InvokeTest>) Class.forName("com.example.zp.demo.testDemo.InvokeTest");
        //形式一:获取一个对象
//        Constructor con =  clazz.getConstructor();
//        InvokeTest m = (InvokeTest) con.newInstance();
        //形式二:直接new对象,实际上不是框架的话,自己写代码直接指定某个对象创建并调用也可以
        InvokeTest m = new InvokeTest();
        String[] s = new String[]{"handsome","smart"};
        //获取Method对象
        Method method = clazz.getMethod("test", String[].class);
        //调用invoke方法来调用
        method.invoke(m, (Object) s);
    }

所以使用invoke方法要比别的方法多做一步,就是构建一个Method对象,这个对象替代的是现在程序要调用方法的替代品。

而且除了参数以外,invoke还会多要一个对象,因为方法调用需要对象,所以invoke要想调用的目标方法,就需要目标方法的需要的对象。

看起来invoke方法不仅比平常方法直接调用要麻烦很多,但是你有想过吗,我只需要输入参数,我可以调用替代各种方法,在未知的情况下,根据条件决定去调用什么对象,什么方法,一下子就让代码变得灵活,这不仅是invoke的妙处,也是整个反射的妙处,在程序运行时根据条件灵活使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java的invoke方法 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 2021-06-10其他常用类

    StringUtils isNotBlank 判断不为空且也不是空字符串
  • 生成对抗性网络简介

    生成对抗性网络简介 1 原理 1 GANs如何工作 2 GAN架构 3 培训GAN 4 艺术家与评论家 5 评估指标 6 GAN变体 7 GAN应用 8 图像合成 Image synthesis 9 图像到图像的转换 Image to im
  • MySQL之InnoDB存储结构

    1 InnoDB存储引擎 InnoDB存储引擎最早由Innobase Oy公司开发 属第三方存储引擎 从MySQL 5 5版本开始作为表的默认存储引擎 该存储引擎是第一个完整支持ACID事务的MySQL存储引擎 特点是行锁设计 支持MVCC
  • 解决eclipse无法解析导入org.eclipse.swt库

    右键点击项目 gt Build Path gt Config Build Path 然后选择Libraries标签页 点击Add External JARs 再到你的eclipse安装目录下的plugins目录下寻找 org eclipse
  • JNI手动释放内存(避免内存泄露)

    1 哪些需要手动释放 不要手动释放 基本类型 jint jlong jchar 需要手动释放 引用类型 数组家族 jstring jobject jobjectArray jintArray jclass jmethodID 2 释放方法
  • 并发编程-CompletableFuture解析

    1 CompletableFuture介绍 CompletableFuture对象是JDK1 8版本新引入的类 这个类实现了两个接口 一个是Future接口 一个是CompletionStage接口 CompletionStage接口是JD
  • launch the mysql_MySQL安装最后一步无响应解决方法

    一 卸载及安装 MySQL安装到最后一步就卡住 如图 卸载原来安装的MySQL1 首先 卸载MySQL 2 然后 删除C盘下 C ProgramData MySQL 文件 然后重新安装MySQL 但是 这里要注意了 安装图1中时不要勾上 L
  • App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.

    app涉及到http访问时 会出现这个错误 App Transport Security has blocked a cleartext HTTP http resource load since it is insecure 解决方法是
  • 【libevent 】libevent 多线程实现高并发

    当你看到这篇文章时 想必你对libevent已经有了足够的了解 笔者在此就不多做描述了 直接进入正题 1 起因 最近在做Redis中间件 目标实现集群管理 分布式数据处理 高性能 由于在某些情况下 单个节点的Redis性能可能无法满足需求
  • 近半数年轻人存款不过十万,这届年轻人是存不下钱吗?

    近期 关于年轻人存款多少的话题 再一度登上了微博热搜 某媒体以一线和新一线城市年轻人为主要对象开展了抽样调查 结果显示 在1852位受访者中 存款低于1万的约有五分之一 而另一个分界点是10万 属于1 10万这个区间的人数最多 如果你的存款
  • linux 配置nginx文件下载页面

    root localhost conf vim nginx conf user nobody worker processes 1 events worker connections 1024 http include mime types
  • 从原理到应用教你了解毫米波雷达

    关注公众号 发现CV技术之美 本文转自西湖大学智能无人系统课题组 作者丁苏生 毫米波雷达基础知识 简介 毫米波雷达 mmWave Rader 采用毫米波作为电磁波发送信号 捕捉并处理电磁波经过路径障碍物的反射信号后可获取目标物体的 速度 距
  • Windows 让cmd启动的程序在后台运行

    在Linux下要使程序后台运行 可通过 java jar Client jar 来实现 在Windows下 则通过 start b java jar Client jar 来实现 20181227更新 这里说的后台运行是指在当前Termin
  • spring 配置

    不配置 启动事务 会报错 404 启用事务管理 EnableTransactionManagement SpringBootApplication scanBasePackages w sh EnableJpaRepositories ba
  • CentOS7安装redis5.0并且搭建集群

    记录在两台虚拟机 版本 CentOS7 上搭建Redis集群 Redis版本 redis 5 0 4 过程如下 1 下载安装 首先在一台虚拟机A IP 192 168 1 103 上新建目录redis 接着进入该目录下 下载redis 5
  • openmp设置线程数目_线程池的参数、配置、基本概念

    线程池的概念和工作机制 概念 首先系统空闲时在创建大量线程 这些线程的集合成为线程池 线程的生老病死都由线程池来决定 工作机制 当有任务到来时 提交给线程池 由线程池来指定线程执行任务 线程池会在内部寻找是否有可以执行任务的线程 任务执行完
  • vue+go-gin+nginx实现后台管理系统

    前后端分离的经典后台管理系统 主要用到的技术和组件 前端 vuejs 组件element ui ant vue axios 后端 golang 框架go gin swagger组件 服务代理 nginx 过程中的疑难问题和关键点记录 一 n
  • IOS_swift文件系统

    func files 应用根目录 let dir NSHomeDirectory NSLog dir dir 文档目录 let doc NSSearchPathForDirectoriesInDomains DocumentDirector
  • HTML制作简单的页面

    一 HTML页面制作代码部分
  • Java的invoke方法

    如果读一些Java或者相关框架的源码 实际上一定会经常出现invoke方法的调用 在自己或者团队封装框架时 如果有时候弄得不好经常也会报invoke相关的错 invoke方法是干什么的 有什么具体用途 首先要了解invoke方法干什么的以及