簡體   English   中英

如何僅使用 Core Java 將鍵值對映射注入對象?

[英]How to inject a map of key-value pairs into an Object with just Core Java?

如何僅使用 Core Java 將映射注入到對象中?

我有一個包含 4 個鍵值(字符串,對象)對的映射和一個包含 3 個字段的類,我想根據鍵名調用 setter 方法並設置它們。

{
 "variableA": "A",
 "variableB": true,
 "variableC": 1,
 "variableD": "DONT USE"
}

public Class Example {
  public void setVaraibleA(String variableA);
  public void setVaraibleB(Boolean variableB);
  public void setVaraibleC(Integer variableC);
}

Example example = new Example();
// Do something to map it
assert(example.getVariableA.equals("A"));
assert(example.getVariableB.equals(true));
assert(example.getVariableC.equals(1));

您可以使用 Java 反射來獲取一個方法(給定它的名稱)並使用給定的參數調用它。

Example example = new Example();
Method method = Example.class.getMethod("setVariableA", String.class);

method.invoke(example, "parameter-value1");

對於@BeppeC 的回答,如果您無法輕松確定在運行時注入的對象的類型,並假設您沒有重復的屬性名稱,我將使用Class 的getMethods()方法和Method 的getName()方法。

基本上,我會寫一些如下的代碼:

Method[] exampleMethods = Example.class.getMethods();
Map<String, Method> setterMethodsByPropertyName = new HashMap<>(exampleMethods.length);
for (Method exampleMethod : exampleMethods) {
  String methodName = exampleMethod.getName();
  if (!methodName.startsWith("set")) {
    continue;
  }
  // substring starting right after "set"
  String variableName = methodName.substring(3);
  // use lowercase here because:
  // 1. JSON property starts with lower case but setter name after "set" starts with upper case
  // 2. property names should all be different so no name conflict (assumption)
  String lcVariableNmae = variableName.toLowerCase();
  setterMethodsByPropertyName.put(lcVariableName, exampleMethod);
}

// later in the code, and assuming that your JSON map is accessible via a Java Map
for (Map.Entry<String, ?> entry : jsonMap.entrySet()) {
  String propertyName = entry.getKey();
  String lcPropertyName = propertyName.toLowerCase();
  if(!setterMethodsByPropertyName.containsKey(lcPropertyName)) {
    // do something for this error condition where the property setter can't be found
  }
  Object propertyValue = entry.getValue();
  Method setter = setterMethodsByPropertyName.get(lcPropertyName);
  setter.invoke(myExampleInstance, propertyValue);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM