Univocity - возможно ли проанализировать файл в сгенерированном bean-классе / классе времени выполнения?

Я использую однозначность для анализа некоторых файлов в javabeans. Эти бины являются скомпилированными классами. Однако я хочу сгенерировать эти классы во время выполнения, а затем проанализировать файлы во время выполнения сгенерированных классов.

Полный код здесь: Gist

Фрагмент кода, который использует библиотеку Univocity:

private static void parseBean(final Class<?> dynamicClass) throws FileNotFoundException {
        @SuppressWarnings("unchecked")
        final BeanListProcessor<?> rowProcessor = new BeanListProcessor<Class<?>>((Class<Class<?>>) dynamicClass);

        final CsvParserSettings parserSettings = new CsvParserSettings();
        parserSettings.setProcessor(rowProcessor);
        parserSettings.setHeaderExtractionEnabled(false);
        parserSettings.getFormat().setDelimiter('|');
        parserSettings.setEmptyValue("");
        parserSettings.setNullValue("");

        final CsvParser parser = new CsvParser(parserSettings);
        parser.parse(new FileReader("src/main/resources/person.csv"));

        final List<?> beans = rowProcessor.getBeans();
        for (final Object domain : beans) {
            final Domain domainImpl = (Domain) domain;
            System.out.println("Person id is: " + domainImpl.getIdentifier());
            System.out.println("Person name is: " + domainImpl.getColumnByIndex(1));
            System.out.println();
        }
    }

Файл выглядит так:

0|Eric
1|Maria

Все значения кажутся нулевыми, поэтому что-то идет не так при анализе файла и его сопоставлении с bean-компонентом...

Person id is: null
Person name is: null 

Можно ли анализировать файлы в сгенерированных bean-компонентах / классах во время выполнения, используя библиотеку Univocity?

1 ответ

Решение

Проблема в том, что ваш код не генерирует @Parsed аннотации правильно. Проверь это:

    Object o = dynamicClass.newInstance();
    Field f = dynamicClass.getDeclaredField("id");
    f.setAccessible(true);
    java.lang.annotation.Annotation[] annotations = f.getAnnotations();
    System.out.println(Arrays.toString(annotations));

Вы получите пустой массив аннотаций. Я исправил ваш код для правильной генерации аннотаций:

Измени свой addAnnotation метод к этому:

private static void addAnnotation(final CtClass clazz, final String fieldName, final String annotationName, String member, int memberValue) throws Exception {
    final ClassFile cfile = clazz.getClassFile();
    final ConstPool cpool = cfile.getConstPool();
    final CtField cfield = clazz.getField(fieldName);

    final AnnotationsAttribute attr = new AnnotationsAttribute(cpool, AnnotationsAttribute.visibleTag);
    final Annotation annot = new Annotation(annotationName, cpool);
    annot.addMemberValue(member, new IntegerMemberValue(cpool, memberValue));
    attr.addAnnotation(annot);
    cfield.getFieldInfo().addAttribute(attr);
}

И назовите это так:

addAnnotation(cc, "id", "com.univocity.parsers.annotations.Parsed","index", 0);

С этим изменением я могу проанализировать пример ввода, такой как этот:

parser.parse(new StringReader("0|John|12-04-1986"));

И получит следующий вывод:

Person id is: 0
Person name is: John

Надеюсь это поможет.

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