通过存储在字符串中的名称调用方法而不使用反射 API?

2023-12-21

我知道,使用 Reflection API,我们可以通过存储在字符串中的名称来调用方法。

但是,Reflection API 不能用于高性能应用程序。 在我的应用程序中,方法将以非常高的速率被调用。所以,我不能使用Reflection API。

那么,Reflection API 有哪些替代方案呢?

我做了研究,发现可以使用 cglib 和其他代码生成库。

但是,我没有找到任何通过存储在字符串中的名称来调用方法的示例。

一个关于反射替代方案的例子也很好。

Update:实际上我正在实现一些主从通信API。其中从站将远程调用主站方法。而且,方法调用的速率非常高(每秒大约 50 个方法调用)。因为,主设备不断轮询从设备是否有任何响应。那么,在如此高的调用率下,我应该尝试一下反思吗?


这就是反射for。在排除它之前,我建议您尝试一下,看看在过去几年的任何 JVM 上,您是否确实看到了与之相关的任何性能问题。我怀疑你不会。

Your only other real option (actually, there's cglib https://github.com/cglib/cglib; see this other answer for more, and why you may not want to use it https://stackoverflow.com/a/23580118/157247) is a method that you let people call, pass in the name of the method to call, and then dispatch to that method (e.g., with a big switch, or a dispatch table, or similar). E.g.:

public Object callMethod(String methodName, Object[] args) {
    switch (methodName) { // Using strings in `switch` requires a recent version of Java
        case "foo":
            return this.foo(args[0]);
        case "bar":
            this.bar(args[0], args[1]);
            return null;
        // ...and so on...
        default:
            throw new AppropriateException();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过存储在字符串中的名称调用方法而不使用反射 API? 的相关文章

随机推荐

  • Restful MVC Web Api 继承

    我正在为自己构建一个 asp net mvc 4 web api 我已经经历过微软视频 http www asp net web api videos getting started your first web api我认为他们很好 使用
  • LINQ 中的子查询位于 select 语句中,而不是 where 子句中

    我需要做如下的事情 SELECT p name SELECT COUNT p id FROM products WHERE products parent id p id AS sub products FROM products AS p
  • 无法在 python 中将 pandas 数据框中的列添加到 mysql

    我已经从 python 连接到 mysql 我可以使用 df to sql 命令将整个数据帧添加到 sql 中 当我从 pd DataFrame 添加 更新单个列时 无法更新 添加 这是有关数据集 结果的信息 In 221 result s
  • Python 3 中未定义名称“xrange”[重复]

    这个问题在这里已经有答案了 我尝试执行以下代码 但无法执行错误 名称 xrange 未定义 pages requests get build group request offset WINDOW SIZE i count WINDOW S
  • Spark中如何处理多行输入记录

    我将每条记录分布在输入文件 非常大的文件 中的多行中 Ex Id 2 ASIN 0738700123 title Test tile for this product group Book salesrank 168501 similar
  • 将 csv 中的行拆分为多个标题行

    我对 python 很陌生 所以请温柔一点 我有一个 csv 文件 以这种格式向我报告 所以我对此无能为力 ClientAccountID AccountAlias CurrencyPrimary FromDate SomeID SomeA
  • 广播意图已取消。安卓GCM

    我一直在与这个错误作斗争 但我放弃了 每次我尝试使用 GCM 发送消息时 LogCat 上都会出现此错误 我没能做什么 我已按照 Android 示例设置 GCM 通知 这是 LogCat 错误 编辑 消息实际上已通过 但我认为此错误不正常
  • Cygwin 安装挂起 - man-db

    我正在尝试在 Windows 2012R2 64 位 上安装 Cygwin 64 位 下载和初始设置已完成 但当到达 man db etc postinstall man db 时 设置挂起 并且永远如此 我等了1 5个多小时 但仍然没有任
  • 判断一个数组是否包含另一个数组中的所有元素

    我试图循环 2 个数组 外部数组比另一个数组长 它将循环第一个数组 如果第二个数组不包含该 int 它将返回 false 但我不知道该怎么做 这是我到目前为止所拥有的 public boolean linearIn int outer in
  • 在调用 toupper()、tolower() 等之前,我是否需要转换为 unsigned char?

    前段时间 Stack Overflow 上有高知名度的人在评论中写道 有必要投一个char 论证unsigned char打电话之前std toupper and std tolower 以及类似的功能 另一方面 Bjarne Strous
  • 机械化 br.click_link() 和 br.follow_link() 之间的区别

    我正在使用 mechanize 来自动化一些表单提交 为此 我需要转到某个网站的主页 单击包含特定文本的链接 该链接会将我重定向到另一个页面并在新页面中填写表格 我尝试使用 response br follow link text rege
  • 在 Gradle 4.1 中更改 apk 输出文件夹

    我想更改APKoutput folder这就是我以前所做的 applicationVariants all variant gt variant outputs all def filePath rootProject rootDir ab
  • 网络字体并提供后备字体

    使用时web fonts using font face我想知道使用后备字体的推荐方法是什么 例如 如果我使用的是粗体网络字体 例如 font face font family OpenSansBold src url fonts Open
  • 使用 html5 音频读取文本时向上滚动并隐藏它

    我正在使用代码来突出显示使用 html5 音频读取的文本单词 并且在单击相邻句子时也会读取音频 我需要的是使正在读取的行从页面中消失 并且正在读取的下一行跳转到其位置 依此类推 所以到最后页面中什么都没有留下 但是 1 音频播放器 2 突出
  • 未找到名为“debug”的 KotlinJvmAndroidCompilation

    我正在尝试将我的项目更新到最后一个 gradle v6 2 2 但我遇到了下一个错误 A problem occurred configuring project app gt Failed to notify project evalua
  • 以编程方式为 Lotus Notes 创建约会

    我需要创建一个约会 日历条目 并将其自动分发给某些受邀者 我现在有两个问题 1 日历条目未出现在主席的日历上 我已经通过将主席添加为必需的与会者来解决此问题 这会向他们发送确认通知 但我想知道如何自动添加它 2 已向受邀者发送邀请 但无法确
  • python 检查html是否有效

    如何使用Python检查HTML代码的有效性 我需要关闭标签检查 并在标签参数中使用大括号 例如 a href xxx 和其他可能的验证 我可以使用哪些库 嗯 这并不完全是您想要的 但是为了验证我所工作的网站的 HTML 我要求 W3C 验
  • 模板类型推导失败(std::empty 作为谓词)

    我有一个向量向量 我想检查它们是否全部为空 使用标准库 我尝试过 include
  • 历史前进/后退按钮不适用于 Angular 2 路由器

    历史记录 推送状态 前进 后退按钮不适用于 Angular 2 路由器 我已经在 Chrome 和 Firefox 中对此进行了测试 前进按钮永远不会起作用 后退按钮仅起作用 2 个步骤 而 UI 不会根据后退按钮进行响应 我有以下代码 应
  • 通过存储在字符串中的名称调用方法而不使用反射 API?

    我知道 使用 Reflection API 我们可以通过存储在字符串中的名称来调用方法 但是 Reflection API 不能用于高性能应用程序 在我的应用程序中 方法将以非常高的速率被调用 所以 我不能使用Reflection API