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.