2017-08-30 434 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