Java 具有匿名类的CGLib增强器

Java 具有匿名类的CGLib增强器,java,reflection,cglib,Java,Reflection,Cglib,我正在使用CGLib代理类。我遇到了一个无法增强匿名类的问题,因为它们没有默认构造函数 java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given 我的代码如下所示: Enhancer enhancer = new Enhancer(); enhancer.setCallback(new MethodInterceptor() { .... }); enh

我正在使用CGLib代理类。我遇到了一个无法增强匿名类的问题,因为它们没有默认构造函数

java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
我的代码如下所示:

Enhancer enhancer = new Enhancer();
enhancer.setCallback(new MethodInterceptor() { .... });
enhancer.setSuperclass(type); // type is the Class I'm trying to enhance
enhancer.create();
但是,如果增强类是匿名的(没有默认构造函数),则会引发以下异常


有办法解决这个问题吗?

JVM的验证器确保您调用有效的构造函数链。解决这一问题的唯一方法是在启动JVM时通过命令行禁用验证器,这通常不是您想要做的,因为它会给您的应用程序带来一些不安全因素

因此,您必须调用匿名类的有效构造函数,该构造函数由cglib创建的子类模仿。因此,该类的构造函数将其封闭类的实例作为其参数。如果使用CGLIB创建一个纯代理,它从不调用一个真正的方法,您可以考虑将<代码> null <代码>交给这个构造函数,但是您仍然需要在提交参数之前选择正确的构造函数。 您可以通过调用:

enhancer.create(new Class<?>[] {type.getEnclosingClass()}, new Object[] {null})
实现同样的逻辑。只需删除调用拦截时不需要的(带注释的)参数

new ByteBuddy()
  .subclass(type)
  .method(any()).intercept(MethodDelegation.to(new Object() {
     @RuntimeType
     public Object intercept(@SuperCall Callable<?> c, 
                             @Origin Method m, 
                             @AllArguments Object[] a) throws Exception {
       // implement your interception logic
     }
   }).make();