首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何规避Class.forName()方法

如何规避Class.forName()方法
EN

Stack Overflow用户
提问于 2013-12-17 14:21:02
回答 2查看 291关注 0票数 2

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

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

这是我的代码:

代码语言:javascript
复制
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;
}

它起作用了,但在这一行:

代码语言:javascript
复制
Class cl = Class.forName("com.epam.lab.model.chocolate." + name);

但是,有些缺点是这种方法需要有全名的类包含包。

这完全是从不同的包装。但我得从别的地方上别的课。forName()的限制不允许我这样做。

如何规避Class.forName() constraints?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 14:34:12

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

阅读:

代码语言:javascript
复制
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进行相同的注释。

票数 3
EN

Stack Overflow用户

发布于 2013-12-17 14:38:12

恐怕不可能--实例化您需要提供类的完全限定名。

但是也许您可以在解析的xml中提供更多的信息--例如包名的一部分,它在不同类型的糖果中是不同的?

代码语言:javascript
复制
String name = path.evaluate("/gift/item[" + i + "]/name", doc);
String type = path.evaluate("/gift/item[" + i + "]/type", doc);
double weight = Double.parseDouble(path.evaluate("/gift/item[" + i + "]/weight", doc));
Class cl = Class.forName("com.epam.lab.model" + type + "." + name);

或者如果XML格式是密封的,那么也许您可以在表示它们的特定甜食名称和类包之间创建一个映射?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20636586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档