如何使用反射在 Java 8 中获取方法参数名称?

2023-12-07

Java 8 能够使用 Reflection API 获取方法参数名称。

  1. 如何获取这些方法参数名称?

  2. 据我所知,类文件不存储形式参数名称。我如何使用反射获得这些?


我如何获取这些方法参数名称?

基本上,您需要:

  • 获取对 a 的引用Class
  • 来自Class,获取对a的引用Method通过致电getDeclaredMethod() or getDeclaredMethods()它返回对的引用Method objects
  • 来自Method对象、调用(从 Java 8 开始新增)getParameters()它返回一个数组Parameter objects
  • On the Parameter对象、调用getName()
Class<String> clz = String.class;
for (Method m : clz.getDeclaredMethods()) {
   System.err.println(m.getName());
   for (Parameter p : m.getParameters()) {
      System.err.println("  " + p.getName());
   }
}

Output:

...
indexOf
  arg0
indexOf
  arg0
  arg1
...

据我所知,.class 文件不存储形式参数。那么我如何使用反射来获取它们呢?

请参阅 javadocParameter.getName():

... 如果参数的名称存在,那么这个方法返回类文件提供的名称. 否则,这个方法合成 argN 形式的名称,其中 N 是声明参数的方法的描述符中参数的索引。

JDK 是否支持此功能是特定于实现的(正如您从上面的输出中看到的,JDK 8 的 build 125 不支持它)。类文件格式支持可选属性,这些属性可由特定 JVM/javac 实现使用,并且会被不支持它的其他实现忽略。

请注意,您甚至可以使用以下命令生成上述输出arg0, arg1, ...对于 Java 8 之前的 JVM - 您需要知道的只是可通过以下方式访问的参数计数Method.getParameterTypes():

Class<String> clz = String.class;
for (Method m : clz.getDeclaredMethods()) {
  System.err.println(m.getName());
  int paramCount = m.getParameterTypes().length;
  for (int i = 0;  i < paramCount;  i++) {
    System.err.println("  arg" + i);
  }
}

JDK 8 的新增功能是有一个扩展的 API 和可能性为 JVM 提供真实参数名称代替arg0, arg1, ...

支持此类可选功能可以通过可选属性它可以附加到各种类文件结构。看4.6.方法为了method_info类文件中的结构。也可以看看4.7.1.定义和命名新属性在 JVM 规范中。

由于在 JDK 8 中,类文件版本将增加到 52,因此也可以更改文件格式本身来支持此功能。

也可以看看JEP 118:在运行时访问参数名称了解更多信息和实施替代方案。建议的实现模型是添加一个存储参数名称的可选属性。由于类文件格式已经支持这些可选属性,因此在某种程度上这甚至是可能的,以便旧版 JVM 仍然可以使用类文件,而按照规范的要求,它们会被简单地忽略:

Java 虚拟机实现需要默默地忽略它们无法识别的属性。

Update

正如 @assylias 所建议的,源代码需要使用以下命令进行编译javac命令行选项-parameters为了将参数名称反射的元数据添加到类文件中。但是,这当然只会影响使用此选项编译的代码 - 上面的代码仍然会打印arg0, arg1等等,因为运行时库不是使用此标志编译的,因此类文件中不包含必要的条目。

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

如何使用反射在 Java 8 中获取方法参数名称? 的相关文章

  • RxJava + Retrofit 2 的正确使用方法

    我有这样的 JSON success true data id 29 name u0420 u0435 u0441 u0442 u043e u0440 u0430 u0446 u0456 u044f u0411 u0430 u0447 u0
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • jpa2 CriteriaBuilder order by “ORDER BY 表达式必须出现在选择列表中”

    我正在写一个查询标准生成器 但无法添加order by子句 因为它随消息一起抛出错误ORDER BY 表达式必须出现在选择列表中这是我的实体 public class A Integer aId ManyToOne JoinColumn n
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • EMF Eclipse:带有自定义字段(属性)的枚举

    好吧 在 Java 中这是可能的 import org eclipse emf common util Enumerator public enum MyEnum implements Enumerator LITERAL1 0 Name
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • Java 中的 MP4 容器编写器

    我想找到一个免费的 Java MP4 容器 编写器 我不需要编码器 只需要能够根据预期值写入正确原子的编码器 Bonus对于这样一个库 也可以编写 有效 F4V 我更喜欢纯 Java 解决方案 而不是使用 JNI 或外部可执行文件的解决方案
  • org.apache.commons.codec.digest.Md5Crypt.md5Crypt 函数。 linux下出现异常,windows下正常

    我们正在使用commons codec加密密码 使用org apache commons codec digest Md5Crypt md5Crypt功能 在Windows环境下工作正常 但在CentOS上却抛出异常 我们有3台centOS
  • 为什么我要使用责任链而不是 switch 语句

    考虑一下您已经获得了多次验证 仅当要检查的对象属于某种类型时 这些验证才应生效 为什么我要使用责任链而不是 switch 语句 责任链示例 public class Executor Inject private ValidatorFact
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • vm 参数中的 -D 是什么,它表示为什么我们必须在 vm 参数中始终指定 -D

    vm 参数中的 D 是什么 它表示为什么我们必须在 vm 参数中始终指定 D 有什么标准吗 如果是 那是什么以及指定的位置 D 设置当前运行的 java 程序可以访问的属性值 它允许程序员设置程序运行所需的值 但程序不知道这些值是什么 因此
  • 反应式 Spring Webflux REST 控制器内部重定向

    我正在为 spring 反应项目创建简单的控制器服务器 在设置重定向到另一个位置时 我在调用时发现错误http localhost 8080 There was an unexpected error type Internal Serve
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • Spring Transactional 减慢了整个过程

    我正在尝试分析我有两堂课的情况 其中一个类是 ProcessImpl 它是起点并在内部调用其他子事务 我不知道出了什么问题 processImpl正在导入一些东西并将相关数据写入数据库 Specs Spring orm版本 3 2 18 发
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签

随机推荐

  • 编译静态版QT + OpenSSL 支持

    我从这里下载了 qt everywhere opensource src 5 8 0 的源文件 https download qt io snapshots qt 5 8 5 8 0 latest src 我想编译它并支持静态版本的 QT
  • 自动重命名视频文件

    我有很多文件想要重命名 手动重命名需要很长时间 它们是视频文件 通常采用以下格式 节目名称 剧集编号 剧集名称 例如 绝命毒师 101 Pilot 我想做的是将 101 部分更改为我自己的约定 S01E01 我认为在一系列节目中 该字符串的
  • 无法在 Windows 中安装 Pylint - python?

    我是Python新手 我在Windows上安装了Python 位于以下目录中C Program Files Python36 我在用vscode当我尝试在 IDE 中运行以下命令时integrated terminal C Program
  • 使用 HTML 和 CSS 在第一个打印页面上显示不同的页眉

    是否可以使用 HTML 和 或 CSS 的任意组合在第一个标题上显示一个标题printed页面然后显示不同的每个后续的标题printed页 我知道关于 media printCSS 标记仅在打印站点时显示某些内容 但这并不能让我在多个页面上
  • 使用 javascript 移动元素

    使用 JavaScript 移动元素的最佳实践是什么 您使用超时或间隔吗 事件定时为 10 毫秒是不好还是会更精确 您是逐像素移动还是总距离的某一部分移动 如果使用间隔 当元素就位时如何停止间隔 我最近两次在 javascript 中看到运
  • Chris Banes 实施 ActionBar-PulltoRefresh、库错误等

    继我之前关于在我的项目中从 github 导入某个库的问题之后 我决定实现一个不同的库 但此时我遇到了很多错误 导入Android Listview通过pull刷新 项目属性错误 与 Google 目前使用 Chris Banes 的 Ac
  • 通过jQuery更改img src:图像不会刷新

    我正在尝试通过 Phonegap Build 应用程序中的 jquery 动态更改 src 如下所示 photo profile attr src fullPath one load function evt console log loa
  • 在带有 extrafont 包的 .eps 图中使用 Arial 时出错

    我在 R 中使用 ggplot2 为出版物生成图形 其中所有图形都需要为 eps 格式 所有字体都需要为 Arial 我一直在关注本指南使用 extrafont 包来做到这一点 据我了解 该行loadfonts device postscr
  • 使用 java 访问嵌套 JSON 对象值

    files f1 png intext A inval 0 inbinary false f2 png intext A inval 0 inbinary true 当f1 png值不固定时如何访问inval的值 即文件名可以是任何名称 它
  • 从 Windows 服务启用/禁用 Aero

    我有一些代码可以在 Vista 中启用 禁用 Windows Aero 服务 并且我想在 Windows 服务中运行它 该代码在独立应用程序中运行 但是当我从服务运行它时 什么也没有发生 不会引发任何错误或异常 我意识到在服务中运行代码与在
  • 使用 ScalaTest 时出现 java.lang.NoSuchFieldError

    我在使用 ScalaTest 时遇到了一个很难调试的错误 奇怪的是 当我的程序没有 Main 对象时 似乎会发生这种情况 但当它有 Main 对象时 却不会发生这种情况 我的代码实际上只是使用带有多态方法的类型类从列表中获取切片 看起来像这
  • 一个用户数据库为多个应用程序数据库提供服务

    我正在管理一个相当大的数据库 该数据库的复杂性和设计都从单个应用程序数据库开始增长 现在计划添加第五个应用程序 该应用程序带有自己的模式和特定数据 我一直在研究 SSO 解决方案 但这并不是我真正想要的 我的目标是拥有一个客户注册 登录和授
  • 使用 Coldfusion SpreadsheetWrite 和 cfscript 创建多个工作表

    我想使用 CF9 SpreadsheetWrite 和 cfscript 创建一个包含两张表的 Excel 文件 就像是 var data spreadsheetNew data var key spreadsheetNew key spr
  • 比较 XML 时如何忽略某些元素?

    我有一条 XML 消息 如下所示
  • MYSQL 未启动(InnoDB:插件初始化因错误通用错误而中止)

    我重新启动了服务器 因为它冻结了 可能是迄今为止我做过的最愚蠢的事情 然后出现了一些内部服务器错误 我很快发现mysql启动失败 service mysql status 我读了mysql错误日志 Pastebin 并开始谷歌搜索 我正在运
  • 标准布局和尾部填充

    David Hollman 最近在推特上发布了以下示例 我对其进行了稍微简化 struct FooBeforeBase double d bool b 4 struct FooBefore FooBeforeBase float value
  • Postgres 函数结束循环并返回错误

    我尝试创建这个函数 但系统返回 循环错误 并且我不知道如何同时返回 3 个变量 我很努力地想弄清楚这个问题 但我没有在任何地方找到答案 CREATE OR REPLACE FUNCTION conta relatos fator norma
  • 如何在R中根据人体gif制作热图? [复制]

    这个问题在这里已经有答案了 我有一张人体 gif 需要在其上绘制热图 要使用的数据在R中 我找到了有关如何导入 gif 的说明 但我不确定如何将数据导入到 gif 中 我想我需要首先将 gif 放在网格上 然后获取一些坐标 然后将数据分配给
  • 用于轴标签的 Matplotlib DateFormatter 不起作用

    我正在尝试调整 x 轴日期刻度标签的格式 以便它仅显示年份和月份值 根据我在网上找到的信息 我必须使用mdates DateFormatter 但它对我当前的代码根本没有生效 有人看出问题出在哪里吗 日期是 pandas Dataframe
  • 如何使用反射在 Java 8 中获取方法参数名称?

    Java 8 能够使用 Reflection API 获取方法参数名称 如何获取这些方法参数名称 据我所知 类文件不存储形式参数名称 我如何使用反射获得这些 我如何获取这些方法参数名称 基本上 您需要 获取对 a 的引用Class 来自Cl