cglib中生成类的工作是由AbstractClassGenerator的create方法使用相应的生成策略完成,具体代码如下:
private GeneratorStrategy strategy = DefaultGeneratorStrategy.INSTANCE; byte[] b = strategy.generate(this);
GeneratorStrategy是一个接口,它负责调用ClassGenerator 的generateClass方法来生成类。DefaultGeneratorStrategy是cglib提供的一个默认的生成策略,部分代码如下:
public class DefaultGeneratorStrategy implements GeneratorStrategy { public static final DefaultGeneratorStrategy INSTANCE = new DefaultGeneratorStrategy(); public byte[] generate(ClassGenerator cg) throws Exception { DebuggingClassWriter cw = getClassVisitor(); transform(cg).generateClass(cw); return transform(cw.toByteArray()); } protected DebuggingClassWriter getClassVisitor() throws Exception { return new DebuggingClassWriter(ClassWriter.COMPUTE_MAXS); }
... ...
protected byte[] transform(byte[] b) throws Exception { return b; } protected ClassGenerator transform(ClassGenerator cg) throws Exception { return cg; } }
DefaultGeneratorStrategy实现了ClassGenerator接口,并提供两个transform方法。用户可以通过继承DefaultGeneratorStrategy并重写相关的方法来检查或者修改生成类。
类生成策略和命名策略一样,使用了策略设计模式,用户可以通过实现GeneratorStrategy接口来自定义生成策略,并使用AbstractClassGenerator的setStrategy方法来设置自定义策略。