动态镜像类并添加构造函数



我有一个没有任何显式构造函数的默认可见性的类。 我想生成类似的类(具有相同的方法和注释),但具有显式公共默认构造函数。 有可能以简单的方式吗? 有现成的代理框架吗? 恐怕使用 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 以使其更短。但是,您要做的是以下几点:

  1. 定义一个新的子类 Foo 并指示 Byte Buddy 不要添加任何构造函数。
  2. 您将此类的修饰符
  3. 定义为类似于 Foo 的修饰符,但另外public
  4. 查找Foo声明的所有构造函数,并为每个此类构造函数定义生成的子类的新构造函数。此构造函数定义与 Foo 的构造函数完全相同的参数类型,并复制修饰符。此外,可见性设置为public
  5. 复制Foo 构造函数的所有注释,以出现在子类的构造函数中。
  6. 对所有参数批注重复此操作。
  7. 创建并加载类(在Foo的类加载器上)。

最新更新