2017-08-30 438 views
1

我正在使用下面的代碼在運行時生成POJO類。我想註釋添加到這個類,是有可能Class級別添加註解生成的類或者我應該使用任何其他的解決方案,以生成類在運行時添加註解到POJO類

import java.util.Map; 

import org.springframework.cglib.beans.BeanGenerator; 
import org.springframework.cglib.core.NamingPolicy; 
import org.springframework.cglib.core.Predicate; 

/** 
* @author dpoddar 
* 
*/ 
public class DynamicClassUtils { 

    public static Class<?> createBeanClass(
      final String className, 
      final Map<String, Class<?>> properties){ 

     final BeanGenerator beanGenerator = new BeanGenerator(); 

     /* use our own hard coded class name instead of a real naming policy */ 
     beanGenerator.setNamingPolicy(new NamingPolicy(){ 
      @Override public String getClassName(final String prefix, 
        final String source, final Object key, final Predicate names){ 
       return className; 
      }}); 

     beanGenerator.setUseCache(true); 
     beanGenerator.setSuperclass(com.xxx.BaseDataImport.class); 

     BeanGenerator.addProperties(beanGenerator, properties); 
     return (Class<?>) beanGenerator.createClass(); 
    } 
} 
+0

我不認爲BeanGenerator有任何方法來添加註釋,可以嘗試JavaAssist。 http://ayoubelabbassi.blogspot.com/2011/01/how-to-add-annotations-at-runtime-to.html有詳細說明如何實現相同。 –

回答

0

CGLIB是一個相當古老圖書館不支持註解。

如果你打開替代方案,看看Byte Byddy(我寫了)。它是開放源代碼和Apache許可的,並且是一種更現代的字節代碼生成方式,其中「新」Java特徵(如註釋)已內置到生成API中。

對於創建bean,你可以定義一個類,如:

Class<?> type = new ByteBuddy() 
    .subclass(BaseDataImport.class) 
    .name(name) 
    .defineProperty("foo", String.class) 
    .annotateType(annotation) 
    .make() 
    .load(classLoader) 
    .getLoaded(); 

這將定義String類型的屬性foo與getter和setter使用隨機提供的註解註釋類。

+0

感謝您的信息。讓我試試它,但它與JavaAssist有何不同?你有比較報告嗎? – Debopam

+0

字節好友有一個更高級別的API,旨在爲類型安全。很多javassist基於編譯字符串。查看性能對比教程。 –

+0

你給出的例子,它會自動添加getter setter嗎?我可以修改getter/setter實現嗎?如果是的話,該怎麼做。 – Debopam