Строка java.lang.ClassCastException в JavaPoet.FieldSpec

Я использую JavaPoet API для создания исходного кода. Тем не менее, в какой-то момент я извлекаю требуемые данные из xml, который представляет собой готовую строку для создания полей, затем я сохраняю строку в 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)

3 ответа

Использовать builder метод, как в примере в комментарии, чтобы создать FieldSpec Объект из текста в элементе XML перед добавлением его в список.

Вы не можете просто бросить какой-то объект FieldSpec объект. Когда вы используете JavaPoet API, вы должны использовать FieldSpec.builder для каждого поля, которое вы хотите создать. Вот как работает API. Смотрите этот API.

Согласно вашему Exception журнал

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

это значит нет IS-A отношения класса com.squareup.javapoet.FieldSpec к классу java.lang.String, Так, String значение не будет присвоено или приведено к какому-либо не переменному типу.

Здесь этот код генерируют 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() вернется String Оцените и сохраните его в объекте, который в порядке, потому что Object Класс является родителем всех других классов, существующих в Java.

Сейчас, (FieldSpec) ElementField Вы пытаетесь разыграть String в классе FieldSpec который не имеет отношения к Java. Потому что нет никакой связи между FieldSpec а также String Учебный класс.

Так, (FieldSpec) ElementField этот кусок кода вызовет исключение.

Другие вопросы по тегам