jOOR icon indicating copy to clipboard operation
jOOR copied to clipboard

IllegalAccessException while object's method invocation

Open sskorol opened this issue 6 years ago • 1 comments

Expected behavior and actual behavior:

Method invocation on objects shouldn't fail with IllegalAccessException.

When I call:

on(annotation).call("methodName").get();

the following exception occurs:

Log
java.lang.IllegalAccessException: class org.joor.Reflect (in module org.jooq.joor) cannot access class com.sun.proxy.jdk.proxy2.$Proxy9 (in module jdk.proxy2) because module jdk.proxy2 does not export com.sun.proxy.jdk.proxy2 to module org.jooq.joor
org.joor.ReflectException: java.lang.IllegalAccessException: class org.joor.Reflect (in module org.jooq.joor) cannot access class com.sun.proxy.jdk.proxy2.$Proxy9 (in module jdk.proxy2) because module jdk.proxy2 does not export com.sun.proxy.jdk.proxy2 to module org.jooq.joor
	at org.jooq.joor/org.joor.Reflect.on(Reflect.java:896)
	at org.jooq.joor/org.joor.Reflect.call(Reflect.java:563)
	at org.jooq.joor/org.joor.Reflect.call(Reflect.java:516)
	at io.github.sskorol.reflection/io.github.sskorol.reflection.testcases.ReflectionTests.lambda$shouldAccessAnnotationValues$5(ReflectionTests.java:27)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:361)
	at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:210)
	at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300)
	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:278)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
	at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:278)
	at java.base/java.util.stream.WhileOps$1$1.accept(WhileOps.java:99)
	at [email protected]/one.util.streamex.StreamEx$2.tryAdvance(StreamEx.java:2741)
	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:550)
	at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
	at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:517)
	at [email protected]/one.util.streamex.AbstractStreamEx.toArray(AbstractStreamEx.java:344)
	at [email protected]/one.util.streamex.AbstractStreamEx.toList(AbstractStreamEx.java:1186)
	at io.github.sskorol.reflection/io.github.sskorol.reflection.testcases.ReflectionTests.shouldAccessAnnotationValues(ReflectionTests.java:28)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at [email protected]/org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
	at [email protected]/org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
	at [email protected]/org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
	at [email protected]/org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
	at [email protected]/org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
	at [email protected]/org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
	at [email protected]/org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
	at [email protected]/org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at [email protected]/org.testng.TestRunner.privateRun(TestRunner.java:770)
	at [email protected]/org.testng.TestRunner.run(TestRunner.java:591)
	at [email protected]/org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
	at [email protected]/org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
	at [email protected]/org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
	at [email protected]/org.testng.SuiteRunner.run(SuiteRunner.java:304)
	at [email protected]/org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
	at [email protected]/org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
	at [email protected]/org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
	at [email protected]/org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
	at [email protected]/org.testng.TestNG.runSuites(TestNG.java:1032)
	at [email protected]/org.testng.TestNG.run(TestNG.java:1000)
	at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.runTests(TestNGTestClassProcessor.java:141)
	at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.stop(TestNGTestClassProcessor.java:90)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class org.joor.Reflect (in module org.jooq.joor) cannot access class com.sun.proxy.jdk.proxy2.$Proxy9 (in module jdk.proxy2) because module jdk.proxy2 does not export com.sun.proxy.jdk.proxy2 to module org.jooq.joor
	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
	at java.base/java.lang.reflect.Method.invoke(Method.java:558)
	at org.jooq.joor/org.joor.Reflect.on(Reflect.java:892)
	... 79 more

Not really sure how can I export a module (which seems dynamic) to joor.

Steps to reproduce the problem:

Here's a sample project: https://github.com/sskorol/reflective-access

Just run ./gradlew test

This line actually causes an issue: https://github.com/sskorol/reflective-access/blob/master/src/test/java/io/github/sskorol/reflection/testcases/ReflectionTests.java#L27

The main idea is to retrieve field annotation's values.

Note that the same code had perfectly worked on Java 8.

Versions:

  • jOOR: 0.9.12
  • Java: OpenJDK 11.0.2

@lukaseder

sskorol avatar Sep 03 '19 17:09 sskorol

See related discussion on SO: https://stackoverflow.com/questions/57869016/illegalaccessexception-while-annotations-method-invocation-via-reflection-open

sskorol avatar Sep 10 '19 15:09 sskorol