我有一个没有任何显式构造函数的默认可见性的类。 我想生成类似的类(具有相同的方法和注释),但具有显式公共默认构造函数。 有可能以简单的方式吗? 有现成的代理框架吗? 恐怕使用 CGLIB 手动完成将是相当大的任务
> cglib 将始终覆盖方法而不复制注释。cglib 中不支持注释,因为它是在 Java 5 问世之前编写的。
如果您愿意使用与 cglib 不同的库,请查看我的库 Byte Buddy 来定义此类构造函数。使用它,您可以定义一个 Java 代理程序来增加原始类的可见性,也可以创建一个子类来指示保留库。
子类将生成如下:
DynamicType.Builder<? extends Foo> builder = new ByteBuddy()
.subclass(Foo.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
.modifiers(() -> return Foo.class.getModifiers() | Modifiers.PUBLIC);
Foo.class.getDeclaredConstructors().forEach( c ->
DynamicType.Builder.MethodAnnotationTarget<? extends Foo> target = builder
.defineConstructor(Arrays.asList(c.getParamaterTypes),
() -> return c.getModifiers() | Modifiers.PUBLIC)
.intercept(SuperMethodCall.INSTANCE)
.annotateMethod(c.getAnnotations());
int index = 0;
for(Annotation[] a : c.getParameterAnnotatations()) {
target = target.annotateParameter(index++, a);
}
builder = target;
)
Class<? extends Foo> subclass = builder.make()
.load(Foo.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER);
起初这看起来像很多代码(我目前正在增强 API 以使其更短。但是,您要做的是以下几点:
- 定义一个新的子类
Foo
并指示 Byte Buddy 不要添加任何构造函数。
您将此类的修饰符 - 定义为类似于
Foo
的修饰符,但另外public
。 - 查找
Foo
声明的所有构造函数,并为每个此类构造函数定义生成的子类的新构造函数。此构造函数定义与Foo
的构造函数完全相同的参数类型,并复制修饰符。此外,可见性设置为public
。 - 复制
Foo
构造函数的所有注释,以出现在子类的构造函数中。 - 对所有参数批注重复此操作。
- 创建并加载类(在
Foo
的类加载器上)。