Proxy classes and reflection (IllegalAccessException)

Remi Forax forax at univ-mlv.fr
Thu Apr 7 13:29:00 UTC 2016


The problem is that RestEasy is using getProxyClass() which is deprecated in 9.

RestEasy want to do a call to Constructor.newInstance on a constructor of the proxy class,
and as Stephane said, RestEasy (which is in the unamed module in your case) do not have access to the proxy class which is in a dynamic module

quote from the javadoc of j.l.r.Proxy
"
Dynamic Modules

A dynamic module is a named module generated at runtime. A proxy class defined in a dynamic module is encapsulated and not accessible to any module. Calling Constructor.newInstance(Object...) on a proxy class in a dynamic module will throw IllegalAccessException; Proxy.newProxyInstance method should be used instead.  
"

so the solution is easier to add a read edge in the code of RestEasy as Stephane said or to change the code of RestEasy to use newProxyInstance() instead.

regards,
Rémi

----- Mail original -----
> De: "Stephane Epardaud" <stef at epardaud.fr>
> À: jigsaw-dev at openjdk.java.net
> Envoyé: Jeudi 7 Avril 2016 15:02:28
> Objet: Re: Proxy classes and reflection (IllegalAccessException)
> 
> No, you have to add a read to the module of the class you're proxying,
> not com.sun.proxy. That'd be your application's module.
> 
> On 07/04/16 14:25, Neil Bartlett wrote:
> > Stephane, I don’t think that would help since the package is not exported:
> > "module jdk.proxy2 does not export com.sun.proxy.jdk.proxy2”.
> >
> > Regards,
> > Neil
> >
> >> On 7 Apr 2016, at 13:13, Stephane Epardaud <stef at epardaud.fr> wrote:
> >>
> >> IIRC RestEasy needs to add a module read to that Class's module it wants
> >> to create a Proxy of.
> >>
> >> On 07/04/16 14:05, Alan Bateman wrote:
> >>> On 07/04/2016 12:39, Dawid Weiss wrote:
> >>>> I don't want to hijack the other thread, so here's a new one I'm stuck
> >>>> with. I get this exception (simplified stack trace a bit):
> >>>>
> >>>> Caused by: java.lang.IllegalAccessException: class
> >>>> org.jboss.resteasy.core.ContextParameterInjector cannot access class
> >>>> com.sun.proxy.jdk.proxy2.$Proxy65 (in module jdk.proxy2) because
> >>>> module jdk.proxy2 does not export com.sun.proxy.jdk.proxy2 to unnamed
> >>>> module @79ca92b9
> >>>> at
> >>>> sun.reflect.Reflection.throwIllegalAccessException(java.base at 9-ea/Reflection.java:411)
> >>>> at
> >>>> sun.reflect.Reflection.throwIllegalAccessException(java.base at 9-ea/Reflection.java:402)
> >>>> at
> >>>> sun.reflect.Reflection.ensureMemberAccess(java.base at 9-ea/Reflection.java:99)
> >>>> at
> >>>> java.lang.reflect.AccessibleObject.slowCheckMemberAccess(java.base at 9-ea/AccessibleObject.java:355)
> >>>> at
> >>>> java.lang.reflect.AccessibleObject.checkAccess(java.base at 9-ea/AccessibleObject.java:347)
> >>>> at
> >>>> java.lang.reflect.Constructor.newInstance(java.base at 9-ea/Constructor.java:444)
> >>>> at
> >>>> org.jboss.resteasy.core.ContextParameterInjector.createProxy(ContextParameterInjector.java:94)
> >>>> ... 53 more
> >>>>
> >>>> I think RestEasy attempts to do create a new instance of a proxy class
> >>>> here (the complete process here eludes my understanding for now). Any
> >>>> clues how this can be solved?
> >>> I assume it should be using newProxyInstance rather that trying to
> >>> instantiate the proxy class directly. The reason it can't instantiate it
> >>> directly is because it has been generated into a "dynamic module"
> >>> (jdk.proxy2 in this case). I assume you'll find that the proxy was
> >>> created with an interface that is not in an exported package.
> >>>
> >>> The "Package and Module Membership of Proxy Class" and "Dynamic Modules"
> >>> sections of the Proxy javadoc [1] has all the details.
> >>>
> >>> -Alan.
> >>>
> >>> [1]
> >>> http://download.java.net/java/jdk9/docs/api/java/lang/reflect/Proxy.html
> >>>
> >>>
> 
> 


More information about the jigsaw-dev mailing list