0

I just followed the way explained in https://stackoverflow.com/a/40300963/330457 and I need help.

I have the following class hierarchy in the same package.

abstract class __BaseEntityService<T extends __BaseEntity<U>, U> {
}

abstract class _BaseEntityService<T extends _BaseEntity<U>, U>
        extends __BaseEntityService<T, U> {
}

public class SomeEntityService
        extends _BaseEntityService<Some, Integer> {
}

And, in my test, same, package, I'm trying to create a dynamic proxy form given concrete service class.

class SomeServiceTest {

    void proxy() {
        final var instance = new SomeService();
        final var handler = new ValidationInvocationHandler(instance, validator);
        // I want to create a proxy
        // whose invocation handled with the handler
        // on the instance.
        final var loaded = new ByteBuddy()
                .subclass(serviceClass)
                .method(ElementMatchers.any())
                .intercept(InvocationHandlerAdapter.of(handler))
                .make()
                .load(serviceClass.getClassLoader())
                .getLoaded();
        try {
            return loaded.getConstructor().newInstance();
        } catch (final ReflectiveOperationException roe) {
            throw new RuntimeException("failed to instantiate " + loaded, roe);
        }
    }
}

I got this.

 java.lang.IllegalAccessError: failed to access class ....__BaseEntityService from class ....SomeService$ByteBuddy$3WcNUA2k (....__BaseEntityService is in unnamed module of loader 'app'; ....SomeService$ByteBuddy$3WcNUA2k is in unnamed module of loader net.bytebuddy.dynamic.loading.ByteArrayClassLoader @1c0ec502)
    at ....SomeService$ByteBuddy$3WcNUA2k.<clinit>(Unknown Source)
    at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)
    at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1155)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:42)
    at java.base/jdk.internal.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:185)
    at java.base/java.lang.reflect.Field.acquireFieldAccessor(Field.java:1132)
    at java.base/java.lang.reflect.Field.getFieldAccessor(Field.java:1113)
    at java.base/java.lang.reflect.Field.set(Field.java:799)
    at net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField.onLoad(LoadedTypeInitializer.java:170)
    at net.bytebuddy.implementation.LoadedTypeInitializer$Compound.onLoad(LoadedTypeInitializer.java:234)
    at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:103)
    at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:6166)
    at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:6154)

How can I solve this?

A working alternative code block using Javassist is this.

final Proxy proxy;
{
    final var factory = new ProxyFactory();
    factory.setSuperclass(serviceClass);
    factory.setFilter(m -> !m.getName().equals("finalize"));
    final var c = factory.createClass();
    try {
        proxy = (Proxy) c.getDeclaredConstructor().newInstance();
    } catch (final ReflectiveOperationException roe) {
        throw new RuntimeException("failed to instantiate the proxy class: " + c, roe);
    }
    final MethodHandler mi = (self, thisMethod, proceed, args) -> handler.invoke(instance, thisMethod, args);
    proxy.setHandler(mi);
    proxy.setHandler(mi);
}
return (T) proxy;
}

Hi, @rafael-winterhalter, by the way.

Mustafa Özçetin
  • 1,893
  • 1
  • 14
  • 16
Jin Kwon
  • 20,295
  • 14
  • 115
  • 184

1 Answers1

0

I solve the problem with a way described in https://stackoverflow.com/a/62120611/330457.

final var loaded = new ByteBuddy()
        .subclass(serviceClass)
        .method(ElementMatchers.any())
        .intercept(InvocationHandlerAdapter.of(handler))
        .make()
        .load(serviceClass.getClassLoader(),
              ClassLoadingStrategy.Default.INJECTION.with(PackageDefinitionStrategy.Trivial.INSTANCE))
        .getLoaded();
try {
    return loaded.getConstructor().newInstance();
} catch (final ReflectiveOperationException roe) {
    throw new RuntimeException("failed to instantiate " + loaded, roe);
}
Jin Kwon
  • 20,295
  • 14
  • 115
  • 184