繁体   English   中英

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

[英]Getting variable type from variable name in Java

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

就我而言,我有一个设置方法“ setUse_status(int use_status)”,但我无法配置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)

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

您不能仅通过classVariableName通过名称来找到方法参数的类型,这并不容易。 您可以(理论上)做的是:

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

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

获取方法参数的名称

并非总是可能的:代码必须与调试信息一起编译。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM