java - Java中从变量名获取变量类型

标签 java variables variable-types

我想从传递的多个值动态调用多个“setter”方法。 每个方法都会有 String、int... 类型的变量来设置(例如:setUserName(String userName) 或 setUserAge(intage))。

就我而言,我有一个设置方法“setUse_status(int use_status)”,但我无法配置 getDeclaredMethod 方法来工作。 似乎在获取方法时,classVariableName 设置为一个字符串(很明显,我将该变量作为变量的名称 [字符串] 传递)。

我正在研究如何获取变量类型并在 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)

最佳答案

您的代码的问题是您在查找方法时使用 classVariableName.getClass() 作为参数类型。由于 classVariableNameString,因此 classVariableName.getClass() 始终为您提供一个字符串。您应该使用类似 dataBaseValue.getClass() 的东西,但也要考虑原始/包装类型的情况。就像,您得到 Integer 但您的 setter 接受 int

仅仅从classVariableName中无法通过名称找出方法参数的类型,这并不容易。你可以(理论上)做什么:

  • 使用 Class.getDeclaredMethods() 获取所有声明的方法。
  • 搜索具有相应名称的方法(可能有多个)。
  • 对于每个方法,请找到参数名称(更多信息见下文)。
  • 选择具有相应参数名称的方法。

至于“发现参数名称”,请参阅以下答案:

Getting the name of a method parameter

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

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

关于java - Java中从变量名获取变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48881171/

相关文章:

c++ - 'inline' 变量可以像内联函数一样内联吗?

vba - vba 中的电子表格复选框是什么类型?

javascript - 检查参数是否为字符串

java - 为什么应用或忽略 Chef 属性?

java - 在 hibernate 中用复合键连接两个表

c++ - SFML C++ 不渲染

c++ - 确保具有全局范围的静态变量在任何地方都存在一次

java - 卡夫卡流: ktable as lookup and destination to merge streams

Java 正则表达式 : Parsing a string with two matching substrings

c# - Microsoft 标准计算器中使用的变量类型