如何获取对象构造函数的参数名称(反射)? [复制]

2024-04-11

假设我以某种方式从其他类获得了对象引用:

Object myObj = anObject;

现在我可以获得这个对象的类:

Class objClass = myObj.getClass();

现在,我可以获得该类的所有构造函数:

Constructor[] constructors = objClass.getConstructors();

现在,我可以循环每个构造函数:

if (constructors.length > 0)
{
    for (int i = 0; i < constructors.length; i++)
    {
        System.out.println(constructors[i]);
    }
}

这已经给了我一个关于构造函数的很好的总结,例如构造函数 public Test(String paramName) 显示为 public Test(java.lang.String)

然而,我不想给我类类型,而是想获取参数的名称..在本例中为“paramName”。我该怎么做呢?我尝试了以下操作但没有成功:

if (constructors.length > 0)
    {
        for (int iCon = 0; iCon < constructors.length; iCon++)
        {
            Class[] params = constructors[iCon].getParameterTypes();
            if (params.length > 0)
            {
                for (int iPar = 0; iPar < params.length; iPar++)
                {
                    Field fields[] = params[iPar].getDeclaredFields();
                    for (int iFields = 0; iFields < fields.length; iFields++)
                    {
                        String fieldName = fields[i].getName();
                        System.out.println(fieldName);
                    }                                       
                }
            }
        }
    }

不幸的是,这并没有给我预期的结果。谁能告诉我我应该怎么做或者我做错了什么?谢谢!


正如评论中提到的罗曼的回答 https://stackoverflow.com/questions/2729580/how-to-get-the-parameter-names-of-an-objects-constructors-reflection/2729595#2729595, 参数名称can如果编译器包含调试符号,则可以检索,但不是通过标准 Java Reflection API。下面的示例说明了如何使用以下命令通过调试符号获取参数名称ASM字节码库 http://asm.ow2.org/:

/**
 * Returns a list containing one parameter name for each argument accepted
 * by the given constructor. If the class was compiled with debugging
 * symbols, the parameter names will match those provided in the Java source
 * code. Otherwise, a generic "arg" parameter name is generated ("arg0" for
 * the first argument, "arg1" for the second...).
 * 
 * This method relies on the constructor's class loader to locate the
 * bytecode resource that defined its class.
 * 
 * @param constructor
 * @return 
 * @throws IOException
 */
public static List<String> getParameterNames(Constructor<?> constructor) throws IOException {
    Class<?> declaringClass = constructor.getDeclaringClass();
    ClassLoader declaringClassLoader = declaringClass.getClassLoader();

    Type declaringType = Type.getType(declaringClass);
    String constructorDescriptor = Type.getConstructorDescriptor(constructor);
    String url = declaringType.getInternalName() + ".class";

    InputStream classFileInputStream = declaringClassLoader.getResourceAsStream(url);
    if (classFileInputStream == null) {
        throw new IllegalArgumentException("The constructor's class loader cannot find the bytecode that defined the constructor's class (URL: " + url + ")");
    }

    ClassNode classNode;
    try {
        classNode = new ClassNode();
        ClassReader classReader = new ClassReader(classFileInputStream);
        classReader.accept(classNode, 0);
    } finally {
        classFileInputStream.close();
    }

    @SuppressWarnings("unchecked")
    List<MethodNode> methods = classNode.methods;
    for (MethodNode method : methods) {
        if (method.name.equals("<init>") && method.desc.equals(constructorDescriptor)) {
            Type[] argumentTypes = Type.getArgumentTypes(method.desc);
            List<String> parameterNames = new ArrayList<String>(argumentTypes.length);

            @SuppressWarnings("unchecked")
            List<LocalVariableNode> localVariables = method.localVariables;
            for (int i = 0; i < argumentTypes.length; i++) {
                // The first local variable actually represents the "this" object
                parameterNames.add(localVariables.get(i + 1).name);
            }

            return parameterNames;
        }
    }

    return null;
}

此示例使用 ASM 库的tree API http://asm.ow2.org/asm32/javadoc/user/org/objectweb/asm/tree/package-frame.html。如果速度和内存很宝贵,您可以重构示例以使用其访客API http://asm.ow2.org/asm32/javadoc/user/org/objectweb/asm/package-frame.html反而。

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

如何获取对象构造函数的参数名称(反射)? [复制] 的相关文章

  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 在 SWT 中单击鼠标触发事件?

    在SWT中 对于MouseListener接口 可用的方法有mouseUp mouseDown and mouseDoubleClick 如何根据用户点击触发事件 我们可以通过结合来做到这一点mouseUp and mouseDown 但没
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • Java XML 解析器添加不必要的 xmlns 和 xml:space 属性

    我在 Windows 10 上使用 Java 11 AdoptOpenJDK 11 0 5 2019 10 15 我正在解析一些旧版 XHTML 1 1 文件 这些文件采用以下一般形式
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • 使用 gldrawpixels 进行 opengl 旋转

    我的团队目前仅限于在 opengl 1 4 平台上绘制图像 这意味着我们无法使用任何漂亮的纹理映射来绘制图像 是的 我们仅限于使用 intel 集成图形平台 这非常烦人 到目前为止 我们能够绘制 缩放和翻转图像 但是制作图形的人声称在使用
  • React 应用程序之间可以通信吗?

    我的项目是三个 React 应用程序的旅程 我想使用从应用程序 1 到应用程序 2 以及从应用程序 2 到应用程序 3 的一些数据 如果要传递的数据很小 我会将其传递到第二个应用程序的 url 中的查询参数中 如果数据很大或私密 我计划将其
  • PHPMailer ,通过电子邮件内容与不同的接收者保持 1 个 SMTP 连接

    phpMailer New PHPMailer phpMailer gt isSMTP phpMailer gt SMTPKeepAlive true for Send your emails right away phpMailer gt
  • 如何使用 Moq 模拟 SoapException 来对错误处理进行单元测试

    我继承了一个小型控制台应用程序 用于调用 SOAP Web 服务 这是一个以各种方式记录异常的嵌套 try catch 的悲剧性混乱 我想围绕抛出 SoapException 时它的行为进行一些测试覆盖 问题 当我无法模拟接口并且无法将属性
  • 如何通过Hibernate获取数据库版本?

    有没有办法通过Hibernate 3 2 API获取底层数据库版本的一些信息 我未能在这里和 javadoc 中找到相关位 获取数据库引擎的版本是特定于实现的 这意味着没有获取版本的共享方法 因此 Hibernate 无法真正提供 API
  • 淡入时的 ScrollTop 引导框模式

    我使用 bootbox js 制作模态 但是当模态淡入并且内容太长时 滚动条会到达底部按钮的级别 当模态出现时 我需要滚动条保持在顶部 我已经解决了添加 off shown bs modal 在 bootbox dialog 之后 boot
  • 使用 webview 显示来自 sdcard 的图像不起作用

    我已经在 sdcard 根目录中下载了 map750 png 文件 但是当我尝试在带有一些文本的 Web 视图中显示它时 只显示文本 你能帮我找出代码中的错误吗 谢谢 setContentView R layout webview mWeb
  • AVPlayer audioSessionGotInterrupted 从后台唤醒时的通知

    我使用 AVAudioPlayer 来播放音频 我启用了背景音频并且音频会话配置正确 我实施了audioSessionGotInterrupted音频会话中断时收到通知的方法 这是我当前的代码 objc private func audio
  • 是否可以从 qt QColumnView 中删除预览小部件?

    我需要在 qt 视图中显示一组分层数据 我正在使用 QColumnView 来显示模型 但是 有一个功能可以使视图中的最后一列被降级为预览小部件 有可能隐藏这一点吗 例如 类似于 view setPreviewWidget NULL 尽管这
  • Python 从动态文件名导入

    我处于以下情况 我有一个 python 脚本main py 根据配置文件运行一些操作 配置文件本身就是一个 python 脚本 类 我希望能够从命令行传递不同的配置文件作为参数并将其导入主脚本中 python 中是否可以动态加载类 如果是这
  • 在运行时将 scala 3 代码从字符串解析为 Scala 3 AST

    我的目标是将 Scala 3 代码作为字符串获取 并在运行时将其解析为 Scala 3 的抽象语法树 在此过程中 如果代码存在编译错误 我应该将其作为某些异常的一部分 更大的目标是如果 scala 代码有效 则最终得到 Expr T 并通过
  • 将包裹的物品居中放置在弹性盒之间的空间中

    对于导航部分 我希望它使用space between理由 对于导航可能需要换行的较小显示器 我希望这些项目能够自行居中 而不是单独排成一行时粘在左侧 nav display flex width 100 flex flow row wrap
  • document.write() 会造成什么损害? [复制]

    这个问题在这里已经有答案了 此刻发生了什么不好的事情document write 被调用 我听说过一些关于document write对 DOM 或 Javascript 库的使用产生不利影响 我面前有一个问题 我怀疑它是相关的 但无法找到
  • SQL - 合并重叠数据

    我在 SQL Server 中有一个简单的数据集 如下所示 ROW Start End 0 1 2 1 3 5 2 4 6 3 8 9 Graphically the data would appear like this 我想要实现的是折
  • C 中的非阻塞睡眠定时器

    我正在为 Windows 寻找一个很好的 C 语言非阻塞睡眠定时器 目前我正在使用sleep 10 这当然是一个阻塞计时器 另外 我希望它不消耗系统资源 就像我的睡眠计时器一样 它不使用任何我满意的 CPU 或系统资源 那么 我可以使用的最
  • Zebra iMZ320 无法理解命令 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试将标签从 Android
  • 如何将容器推送到 Google 容器注册表(无法创建存储库)

    编辑 我只是将其归咎于平台不一致 我现在已经放弃推送到 Google Cloud Container Registry 而是创建了一个 Ubuntu VM 我正在其中执行此操作 出于前面所述的原因 我也投票决定结束这个问题 并且因为这可能应
  • 如何防止加载meteor.local(使用phonegap构建ios应用程序时)

    这是我问的问题的延伸here https stackoverflow com questions 28843616 using meteor app on ipad that was deployed to remote server wi
  • 实体框架表每种类型的性能

    所以事实证明 我是最后一个在实现 TPT 每个类型的表 继承时发现 Microsoft 实体框架中存在的基本层的人 构建了一个包含 3 个子类的原型 基表 类由 20 多列组成 子表由约 10 列组成 一切都运行良好 我继续研究应用程序的其
  • 如何获取对象构造函数的参数名称(反射)? [复制]

    这个问题在这里已经有答案了 假设我以某种方式从其他类获得了对象引用 Object myObj anObject 现在我可以获得这个对象的类 Class objClass myObj getClass 现在 我可以获得该类的所有构造函数 Co