【问题标题】:Getting variable type from variable name in Java从Java中的变量名获取变量类型
【发布时间】:2018-07-30 13:46:20
【问题描述】:

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

就我而言,我有一个 setter 方法“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举个例子吗?在您的示例中是“int”还是“use_status”?
  • 好的,我已经看到了这个可能的解决方案link
  • classVariableName.getClass() 将返回 String - 应该很明显。你的意思是dataBaseValue.getClass() 吗?在这种情况下,请注意 int 不是一个类,即当您将整数作为 dataBaseValue 传递时,您将获得一个包装类,例如如果IntegergetDeclaredMethod(name, Integer.class) 接受int 参数,则不会找到该方法。
  • 是的,在我的例子中是 use_status
  • 但是,我有变量名和类,有没有办法找到setter方法的变量类型?从我的完全无知来看,这应该很简单......

标签: java variables variable-types


【解决方案1】:

您的代码的问题是您在查找方法时使用classVariableName.getClass() 作为参数类型。因为classVariableNameStringclassVariableName.getClass() 总是给你一个字符串。您应该改用dataBaseValue.getClass() 之类的东西,但也要考虑原始/包装类型的情况。比如,你得到Integer,但你的setter接受int

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

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

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

Getting the name of a method parameter

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

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

【讨论】:

  • 尽管如此,使用这种方法我仍然会遇到原始/包装类型问题,不是吗?例如,为浮点类型变量设置一个设置器将不起作用。这是正确的吗?
  • @user6127833 是的,无论如何你必须解决原始/包装类型。我会检查 Apache Commons(可能是 Lang)库,看看它们是否有一些实用程序类。
  • 对此有何建议?
  • @user6127833 除了 - 执行它!没那么难。
  • 抱歉,我还是新手,在寻找方法时我有点迷茫。有没有类似于我必须做的事情的简单例子?也许这个link 是一种方法。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多