2016-10-02 9 views
1

私はunivocityを使っていくつかのファイルをjavabeansに解析しています。これらのBeanはコンパイルされたクラスです。しかし、私はランタイム中にこれらのクラスを生成し、その後、実行時に生成されたクラスでファイルを解析したいと考えています。Univocity - 実行時に生成されるBean /クラスにファイルを解析することは可能ですか?

完全なコードはここにある: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 

すべての値がいるようだがnullなので、ファイルを解析してBeanにマッピングするときに何かが間違っている...

Person id is: null 
Person name is: null 

Univocityライブラリを使用してランタイム生成Bean /クラスにファイルを解析することはできますか?

答えて

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 

これが役立ちます。

+0

魅力的な作品です。間違って生成された注釈コードを指摘してくれてありがとうと、コード修正のためにさらに感謝します。 –

関連する問題