0

我正在使用 JavaPoet api 生成源代码。但是,在某些时候,我从 xml 中获取所需的详细信息,该详细信息是用于创建字段的现成字符串,然后我将字符串保存到 Object,然后我将 object 转换为 FieldSpec,但它给了我异常。是我以错误的方式投射它吗?

public List<FieldSpec> getFieldSpec() throws JDOMException{
    try {
        fieldSpec = new ArrayList<FieldSpec>();//com.squareup.javapoet.FieldSpec
        SAXBuilder builder = new SAXBuilder();
        xmlFile = new File("CodeGenerationXML\\SourceCodeFieldsXML\\Fields.xml");
        doc = builder.build(xmlFile);
        RootXMLFields = doc.getRootElement();
        for(Element field:RootXMLFields.getChild("Fields").getChildren()){
            Object ElementField = field.getText();// returns FieldSpec.builder(String.class,"str").initializer("$S","Hello").addModifiers(Modifier.PRIVATE, Modifier.FINAL).build()
            fieldSpec.add((FieldSpec) ElementField);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return fieldSpec;
}
public static void main(String arg[]) throws JDOMException{
    new AddUpdateFieldsXML().getFieldSpec();
}

例外:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to com.squareup.javapoet.FieldSpec
at RandD.AddUpdateFieldsXML.getFieldSpec(AddUpdateFieldsXML.java:94)
at RandD.AddUpdateFieldsXML.main(AddUpdateFieldsXML.java:103)
4

3 回答 3

0

在将 XML 元素中的文本添加到列表之前,使用builder类似于注释中示例的方法从 XML 元素中的文本创建对象。FieldSpec

于 2016-04-01T08:45:20.007 回答
0

您不能只是将某个对象投射到一个FieldSpec对象上。当您使用JavaPoetAPI 时,您必须使用FieldSpec.builder要创建的每个字段。这就是 API 的工作原理。请参阅此API

于 2016-04-01T08:48:18.893 回答
0

根据你的Exception日志

Exception in thread "main" java.lang.ClassCastException: java.lang.String 
cannot be cast to com.squareup.javapoet.FieldSpec

这意味着 Class与 class没有IS-A关系。因此,不会将值分配或强制转换为任何非变体类型。com.squareup.javapoet.FieldSpecjava.lang.StringString

这里这段​​代码生成Exception

  Object ElementField = field.getText();// return String Values and Store it into the Object. 
  FieldSpec.builder(String.class,"str").initializer("$S","Hello").addModifiers(Modifier.PRIVATE, Modifier.FINAL).build()
            fieldSpec.add((FieldSpec) ElementField); // ElementField contains String Object.

在这里,field.getText();getText() 方法将返回StringValue 并将其存储到 Object 中,这是可以的,因为ObjectClass 是 Java 中存在的 All Other Classes 的父级。

现在,(FieldSpec) ElementField您正在尝试将 String 转换FieldSpec为与 java 无关的类。FieldSpec因为和String类之间没有关系。

因此,(FieldSpec) ElementField这段代码将引发异常。

于 2016-04-01T08:49:50.860 回答