簡體   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