[英]Using Java reflection class to create an object and use it in arraylist
[英]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.