gpt4 book ai didi

java - 如何使用泛型实例化 java 中的类实例?

转载 作者:行者123 更新时间:2023-12-01 07:37:41 27 4
gpt4 key购买 nike

如何使用泛型实例化 java 中的类实例?

我正在尝试从 XML 文件读取数据,然后实例化一个对象,以便我可以将对象的其他属性(从 XML 文件读取)添加到该对象中。我认为最简单的方法(这样我就不必读取类方法名称并找到 setter )是使用构造函数中的所有值实例化对象。

我正在尝试做这样的事情,所以我需要类似的东西:T obj = new Object()但获取对象类

    private static final boolean string_field = true;

private static <T> T getObject(Element e, String[] fieldNames, boolean[] fieldTypes) {
Object[] values = new Object[fieldNames.length];
for (int i=0; i<fieldNames.length; i++) {
values[i] = (fieldTypes[i]==string_field)? getStringValue(e, fieldNames[i])
: getIntegerValue(e, fieldNames[i]);
}
return new T(values);
}

感谢您的建议。

编辑:

这是我更新的代码(未经测试):

    public static <T> List<T> populateObjectList(Document xmlDoc, String tagName,
Class clazz, String[] fieldNames, Class[] fieldTypes) {
List<T> objList = new ArrayList<T>();
NodeList nl = xmlDoc.getElementsByTagName(tagName);
if (nl!=null && nl.getLength()>0) {
for (int i=0; i<nl.getLength(); i++) {
Element e = (Element) nl.item(i);
T t;
try {
t = getObject(e, clazz, fieldNames, fieldTypes);
objList.add(t);
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (IllegalArgumentException ex) {
} catch (InvocationTargetException ex) {
} catch (NoSuchMethodException ex) {
}
}
}
return objList;
}

private static <T> T getObject(Element e, Class clazz, String[] fieldNames, Class[] fieldTypes)
throws InstantiationException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException {
Object[] initargs = new Object[fieldNames.length];
for (int i=0; i<fieldNames.length; i++) {
initargs[i] = (fieldTypes[i].getName().equals("int"))?
getIntegerValue(e, fieldNames[i])
: getStringValue(e, fieldNames[i]);
}
return (T) clazz.getConstructor(fieldTypes).newInstance(initargs);
}

我发布此内容是为了让你们中的一些人能够理解我想要做什么。

再次感谢大家的建议。

最佳答案

您无法实例化泛型类型。 Java 泛型有一个令人讨厌的功能,称为类型删除,这基本上意味着 JVM 在运行时不知道泛型类或方法使用了什么类型。这是为了向后兼容泛型类的预泛型版本,例如集合。

您可以做的就是添加 Class<T> clazz到您的参数列表,然后用以下内容替换方法的末尾:

Class<?>[] paramTypes = new Class[values.length];
for (int i = 0; i < paramTypes.length; i++) {
paramTypes[i] = values[i].getClass();
}
return clazz.getConstructor(paramTypes).newInstance(values);

如果该类没有以正确顺序获取正确类型和参数数量的构造函数,则会引发异常。

警告:仅当构造函数的参数类型与对象类型完全相同时,此方法才有效。例如,如果 values组成 { "Hello", new Integer(2) } ,那么这只会找到签名为 SomeClass(String, Integer) 的构造函数,没有签名 SomeClass(Object, Object) .

关于java - 如何使用泛型实例化 java 中的类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9594165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com