2013-12-17 42 views
2

我需要解析XML文件并使用反射从ArrayList创建一堆对象。如何绕过Class.forName()方法

我用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()约束?

+3

“rescission”?你的意思是......“反思”? –

+0

您可以尝试多种套餐,或者您可以使用https://code.google.com/p/reflections/为您编制索引和搜索课程。 –

回答

3

有一个不错的选择来读取和解析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为其他类。

+0

你能推荐漂亮的jaxb教程吗? –

+0

随着时间的推移,JAXB已经发展成为一件容易的事情。所以我很难指出。在注解之前,XML中有.xsd模式来定义java结构。我发现比注释更容易出错。也许IDE可能会提供支持,NetBeans IDE,IntelliJ IDEA,eclipse +插件。祝你好运。 –

0

恐怕这是不可能的 - 要实例化你需要提供完全合格的班级名称。

但也许你可以提供更多的解析XML信息 - 例如包装名称的不同类型的糖果之间的不同?或者,如果XML格式是封闭的,那么也许你可以创建一个特定的糖果名称和classess包代表它们之间的映射吗?