簡體   English   中英

使用Java反射創建對象

[英]Create object using Java reflection

我從外部源接收到了字符串,這些字符串幾乎是對象構造函數的簽名。 它們包含類名和參數。

例如:

public class Foo {
  public Foo(int x, int y, int z) {
    // do something
  }
}

public class Bar {
  public Bar (int x, boolean bool) {
    // do something
  }
}

假設我有許多這樣的類,並且我想根據收到的字符串(包含類名和參數)從這些類創建對象。 能做到嗎?

我知道我可以使用類似的方法來上課:

String className = "myClass";
Class<?> myClass = Class.forName(className);
//Constructor<?> ctor = myClass.getConstructor();
//Object object = ctor.newInstance(new Object[] { ctorArgument });

但是,如果我在編譯時不知道構造函數有多少個參數,它們將是哪種類型,該如何實例化該對象? 順便說一句,我要從中創建對象的類很可能只有一個可用的構造函數。 但是,每個類與另一個類相比可能具有不同的構造函數。

沒問題,因為newInstance()方法接收一個數組:

public T newInstance(Object ... initargs)

因此,您只需初始化一個包含所有參數的數組並將其傳遞

像這樣的東西:

String[] argsAsString = readValuesFromString(data);
Object[] args = new Object[argAsString.length()];
int i = 0;
Class<?>[] paramTypes = ctor.getParameterTypes();
for (String argStr: argsAsString) {
    args[i] = convertStringToActualType(argStr, paramTypes[i]);
    i++;
}

ctor.newInstance(args);

您可能需要在類上調用getConstructors() ,然后嘗試查找具有正確數量的參數的構造函數。 僅當您沒有兩個或多個構造函數具有相同數量的參數時,此方法才有效。 然后, convertStringToActualType()應該知道如何將字符串值轉換為實際參數。例如,如果它是布爾字段'Boolean.valueOf(argStr)'等-例如:

Object convertStringToActualType(String arg, Class<?> type) {
    if (type == String.class)
        return arg;
    if (type == Boolean.class)
        return Boolean.valueOf(arg);
    throw new IllegalArgumentException("type " + type.getSimpleName() + " not supported");
}

暫無
暫無

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

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