ByteBuddy:设置拦截器时出现AbstractMethodError

ByteBuddy: AbstractMethodError when set interceptor

以下是我的学习代码,执行代码时出现异常:

Exception in thread "main"
java.lang.AbstractMethodError: org.learning.UserRepository$ByteBuddy$etz0xUhc.$$_pharos_set_interceptor(Lorg/learning/Interceptor;)V**

字节好友版本:1.10.14

final TypeCache.SimpleKey cacheKey = getCacheKey(learningClazz, interceptor.getClass());
Class proxyClass = load(learningClazz, proxyCache, cacheKey, byteBuddy ->
  byteBuddy
    .subclass(learningClazz)
    .defineField(ProxyConfiguration.INTERCEPTOR_FIELD_NAME, Interceptor.class, Visibility.PRIVATE)
    .method(not(isDeclaredBy(Object.class)))
    .intercept(MethodDelegation.to(ProxyConfiguration.InterceptorDispatcher.class))
    .implement(ProxyConfiguration.class)
    .intercept(FieldAccessor.ofField(ProxyConfiguration.INTERCEPTOR_FIELD_NAME)
    .withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)));

final ProxyConfiguration proxy = (ProxyConfiguration) proxyClass.getDeclaredConstructor().newInstance();
proxy.$$_pharos_set_interceptor(interceptor);
return (T) proxy;
public interface ProxyConfiguration {

  String INTERCEPTOR_FIELD_NAME = "$$_pharos_interceptor";

  void $$_pharos_set_interceptor(Interceptor interceptor);

  class InterceptorDispatcher {
    @RuntimeType
    public static Object intercept(
      @This final Object instance,
      @Origin final Method method,
      @AllArguments final Object[] arguments,
      @StubValue final Object stubValue,
      @FieldValue(INTERCEPTOR_FIELD_NAME) Interceptor interceptor,
      @SuperMethod Method superMethod
    ) throws Throwable
    {
      if (interceptor == null) {
        return stubValue;
      }
      else {
        return interceptor.intercept(instance, method, arguments, superMethod);
      }
    }
  }
  
}

Package-private 方法被重写,但如果 subclass 被加载到不同的 class 加载器上,JVM 将不会动态调度它们。如果声明方法public,问题应该就解决了。或者,将 class 注入目标 class 加载程序。