当前位置: 首页 > 知识库问答 >
问题:

从Java中的变量名获取变量类型

阮疏珂
2023-03-14

我想从传递的几个值动态调用几个“setter”方法。每个方法都将具有字符串,int...要设置的变量类型(例如:setUserName(String userName)或setUserAge(int age))。

在我的例子中,我有一个setter方法“setUse_status(int use_stats)”,我无法配置getDeclaredMethod方法工作。似乎在获取方法时,classVariableName被设置为String(很明显,我将该变量作为变量的名称[String]传递)。

我正在考虑如何获得变量类型并在getDeclaredMethod调用中设置它。

所以,我有这个代码:

private void  getValueFromColumn(Object paramsClass, String classVariableName, Object dataBaseValue) {

//First create the string with the method name
    String methodName = "set" + classVariableName.substring(0, 1).toUpperCase().toString() +
            classVariableName.substring(1);

    Method loadParamsMethod;


    try {
        loadParamsMethod = paramsClass.getClass().getDeclaredMethod(methodName, classVariableName.getClass());

        try {
            loadParamsMethod.invoke(paramsClass, dataBaseValue);
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

            e.printStackTrace();
        }
    } catch (NoSuchMethodException | SecurityException e) {

        e.printStackTrace();
    }
}

错误是:

java.lang.NoSuchMethodException: com.sener.dbgui.model.params.CommonParameters.setUse_status(java.lang.String)
at java.base/java.lang.Class.getDeclaredMethod(Class.java:2432)
at com.sener.dbgui.utils.ParamsClassUtils.getValueFromColumn(ParamsClassUtils.java:72)
at com.sener.dbgui.utils.ParamsClassUtils.retrieveParamsData(ParamsClassUtils.java:107)
at com.sener.dbgui.utils.ParamsClassUtils.loadAllParameters(ParamsClassUtils.java:39)
at com.sener.dbgui.controller.ComponentController.retrieveParamsFromDB(ComponentController.java:506)
at com.sener.dbgui.controller.ComponentController.access$18(ComponentController.java:494)
at com.sener.dbgui.controller.ComponentController$4.run(ComponentController.java:294)
at java.base/java.lang.Thread.run(Thread.java:844)

共有1个答案

齐俊达
2023-03-14

代码的问题在于,在查找方法时,您使用classVariableName.getClass()作为参数类型。由于classVariableName是StringclassVariableName.getClass()总是给你一个字符串。你应该改用类似dataBaseValue.getClass()的东西,但也要考虑基元/包装器类型的情况。比如,你得到整数,但你的二传手接受整数

你不能仅仅从< code>classVariableName中通过名字找出方法参数的类型,这并不容易。(理论上)你能做的:

    < li >使用< code > class . getdeclaredmethods()获取所有声明的方法。 < li >搜索具有相应名称的方法(可能有多个)。 < li >对于每种方法,查找参数名称(下面将详细介绍)。 < li >选择具有相应参数名称的方法。

至于“发现参数名称”,请看这个答案:

获取方法参数的名称

这并不总是可能的:代码必须使用调试信息编译。

最后,为什么要处理参数名称?Setter 约定本身就足够字符串了,实际上不需要检查参数名称,但它使事情变得更加复杂。只需搜索具有相应名称和签名的方法即可。

 类似资料:
  • 我面临以下问题:我必须给成千上万的图形用户界面元素命名。如果它能像这样工作,那就太好了: 如果我能将元素的名称设置为“Classname.myMenuItem”,那就太好了。 是否有任何方法来获取变量的名称(变量名称ofc,而不是JMenuItem.getName())?

  • 问题内容: 我有一个类,我想找到它的所有 公共字段 (不是方法)。我怎样才能做到这一点? 谢谢! 问题答案: 返回该类的所有公共变量的数组。 返回整个类继承中的字段。如果要仅在相关类中定义字段,而不在其超类中定义字段,请使用,并通过以下方法过滤它们: 的字面实际上代表类型的对象。检查其文档以获取更多有趣的反射方法。 上面的类是。您可以查看整个程序包。

  • 问题内容: 示例代码: 现在,说我想让用户输入一个字符串: 然后,说出用户输入。我将如何检索命名的变量并对其进行处理?像这样: 我抬头看了一些东西,却没发现太多。我确实找到了对“反射API”的引用,但是对于这一简单任务而言,它似乎太复杂了。 有没有办法做到这一点,如果是的话,那是什么?如果“反射”确实有效并且是唯一的方法,那么我将如何使用它来做到这一点?它的教程页面包含了各种我无法理解的内部内容。

  • 问题内容: 我需要在其他班上变数。我怎样才能做到这一点? 所以我尝试在Textcl.class中使用,但是得到了。 问题答案: 您将得到空值,因为inString从未按Robert Kilar在注释中正确指出的那样进行初始化。 您可以通过使用类名来引用静态变量。 示例ClassName.variablename。就你而言 运行您的主类。当您运行inString时,将在该类的构造函数中对其进行初始化

  • 问题内容: 我无法在玉器的类中设置变量名称: 我有: 我想要 谢谢 问题答案: 试试看(尚未测试):

  • 问题内容: 使用Java Reflection,是否可以获得本地变量的名称?例如,如果我有这个: 是否有可能实现一种可以找到这些变量名称的方法,如下所示: 问题答案: 从Java 8开始,可以通过反射获得一些局部变量名称信息。请参阅下面的“更新”部分。 完整的信息通常存储在类文件中。一种编译时优化是删除它,节省空间(并提供一些混淆)。但是,如果存在,则每个方法都有一个局部变量表属性,该属性列出了局