> On Dec 8, 2015, at 7:10 AM, Stephane Epardaud <s...@epardaud.fr> wrote:
> 
> On 08/12/15 16:07, Peter Levart wrote:
>> 
>> 
>> Do you really have to addRead() ? Visibility of of classes
>> (Class.forName()) should only depend on class loader delegation.
>> Enumerating members, when you already have a java.lang.Class object
>> likewise. Looking-up annotations likewise.
>> 
>> What exactly are you trying to do and what exception do you get?
> 
> I have a scanner that can scan annotations of type X (by name) and
> member Y (by name) so it must use reflection to load the annotation and
> member. I got that when accessing the annotation's member Method:
> 
> 
> java.lang.IllegalAccessException: class
> com.redhat.ceylon.model.loader.impl.reflect.mirror.ReflectionAnnotation
> (in module com.redhat.ceylon.model) cannot access interface
> com.redhat.ceylon.compiler.java.metadata.Module (in module
> ceylon.language) because module ceylon.language does not export package

I believe your code is calling Class::getMethod on proxy class something like:

      Method m = proxy.getClass().getMethod(“Y”);
      m.invoke(proxy,….);

The above reflects on the generated proxy class but not the proxy interface X.  
If you did the following, it will get it to work.
      Method m = X.class.getMethod(“Y”);
      m.invoke(proxy,…);

When a proxy is generated to implement non-exported interface X in a named 
module M, such proxy class will be generated in a dynamic proxy [1].  If it 
were generated in module M, the proxy class would access any module-private 
types in M that should be avoided.  IAE was thrown because it reflects on the 
proxy class that is generated in a dynamic module.  

On the other hand, reflecting on a member of a proxy class that is a member of 
a proxy interface, it would be unexpected to the users as proxies are typically 
implementation-specific.   I’ll want to look into this further and what it 
takes to do the access check on the proxy interface that the member belongs to. 
 

Mandy

[1] The package and module membership of Proxy class is specified at:
http://cr.openjdk.java.net/~mr/jigsaw/spec/api/java/lang/reflect/Proxy.html#membership

Reply via email to