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

时间:2018-02-20 08:54:31

标签: java variables variable-types

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

在我的情况下,我有一个setter方法“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)

1 个答案:

答案 0 :(得分:1)

代码的问题在于您在查找方法时使用classVariableName.getClass()作为参数类型。由于classVariableNameStringclassVariableName.getClass()始终会为您提供字符串。您应该使用dataBaseValue.getClass()之类的东西,但也要考虑原始/包装类型的情况。比如,您得到Integer,但您的二传手接受int

您无法通过classVariableName的名称找到方法参数的类型,这并不容易。你能做什么(理论上):

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

至于"发现参数名称",请参阅此答案:

  

Getting the name of a method parameter

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

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