2016-10-02 62 views
1

我正在使用univocity將一些文件解析爲javabeans。這些bean是編譯的類。但是我希望在運行時生成這些類,然後將這些文件解析爲運行時生成的類。Univocity - 是否可以將文件解析爲運行時生成的bean /類?

全部代碼是在這裏:gist

的代碼片段使用了單義庫:

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 

是否可以使用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

工程就像一個魅力。感謝您指出錯誤生成的註釋代碼,並感謝更多的代碼修復。 –

相關問題