gpt4 book ai didi

java - 如何规避 Class.forName() 方法

转载 作者:行者123 更新时间:2023-11-30 08:27:47 25 4
gpt4 key购买 nike

我需要解析 XML 文件并使用反射从 ArrayList 创建一堆对象。

我用 Class.forName() 实现了这一点。

这是我的代码:

public ArrayList<Sweets> parse(String fileName) throws Exception {

File file = new File(fileName);
Document doc = builder.parse(file);

ArrayList<Sweets> items = new ArrayList<Sweets>();
int itemCount = Integer.parseInt(path
.evaluate("count(/gift/item)", doc));

for (int i = 1; i <= itemCount; i++) {

double sugar = Double.parseDouble(path.evaluate("/gift/item[" + i + "]/@sugar", doc));
String name = path.evaluate("/gift/item[" + i + "]/name", doc);
double weight = Double.parseDouble(path.evaluate("/gift/item[" + i
+ "]/weight", doc));

Class cl = Class.forName("com.epam.lab.model.chocolate." + name);
items.add((Sweets) cl.getConstructor(double.class, double.class)
.newInstance(sugar, weight));
}

return items;
}

它有效,但在这一行:

Class cl = Class.forName("com.epam.lab.model.chocolate." + name);

但缺点是此方法需要包含类的全名包。

它完全取自不同的包。但是我需要从其他地方上其他课。 forName() 的限制不允许我这样做。

如何规避 Class.forName() 约束?

最佳答案

除了将 XML 读取和解析为 Java 对象之外,还有一个很好的替代方法:带注释的 JAXB。

阅读者:

MyDoc doc = load(MyDoc.class, "/mydoc.xml");

private <T> T load(Class<T> klazz, String xmlResource) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(klazz);
return klazz.cast(jaxbContext.createUnmarshaller()
.unmarshal(getClass().getResourceAsStream(xmlResource)));
} catch (JAXBException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE,
"Cannot read resource " + xmlResource, e);
throw new IllegalStateException(e);
}
}

@XmlRootElement(name="document")
public class MyDoc {

@XmlElement(name="sweetsList")
public List<Sweets> sweets= new ArrayList<>();
}

<document>
<sweetsList>
...
</sweetsList>
</document>

对于其他类,使用 @XmlElement@XmlAttribute 进行相同的注释。

关于java - 如何规避 Class.forName() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20636586/

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