[ 
https://jira.jboss.org/browse/WELD-737?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12558932#action_12558932
 ] 

Stuart Douglas commented on WELD-737:
-------------------------------------

The problem is that this is a JVM level restriction.

The JVM requires all constructors to call super() or another constructor on the 
current class, and the JVM also enforces access permissions. This means that if 
you try and load a subclass of the class that only has a package private 
constructor you must load it in the same CL as the class being proxied, as when 
it attempts to call super() an IllegalAccessError will be thrown. (The link you 
posted to Guice's bridge class loader actually states it is not used when 
access package-private methods, for precisely this reason).

The support for private constructors that you mention is a non standard 
extension that currently only works on hotspot (as is uses 
com.sun.Unsafe.allocateInstance()), the CDI spec does not require proxying of 
classes with a private default constructor as it is not possible to do it in a 
portable way. 

The javassist dependencies in the proxies are going to be removed as they are 
no longer necessary now that we use a custom ProxyFactory, however the proxies 
will still be dependent on org.jboss.weld classes (although these classes 
should be exported from the osgi bundle).


 


> Proxy instantiation fails with IllegalAccessError for Beans with package 
> private constructor
> --------------------------------------------------------------------------------------------
>
>                 Key: WELD-737
>                 URL: https://jira.jboss.org/browse/WELD-737
>             Project: Weld
>          Issue Type: Bug
>          Components: Proxies
>    Affects Versions: 1.1.0.Beta1
>            Reporter: Sivakumar Thyagarajan
>         Attachments: package-private-constructor-issue.tar.bz2, 
> ProxyServicesImpl.java
>
>
> For Beans with package private constructors, proxy instantiation fails with 
> an Illegal access error as shown below. Since 1.1.0.Beta1 the proxy creation 
> logic in ProxyFactory.addConstructors handles private constructors correctly 
> but doesn't consider package private constructors.
> ----
> Caused by: java.lang.IllegalAccessError: tried to access method 
> org.glassfish.tests.proxies.TestSessionScopedBean.<init>()V from class 
> org.glassfish.tests.proxies.org$jboss$weld$bean-$export$work$workspaces$gfv3$v3$distributions$glassfish$target$glassfish3$glassfish$domains$domain1$applications$jsr88-1370237334428885039$-ManagedBean-class_org$glassfish$tests$proxies$TestSessionScopedBean_$$_WeldProxy
>         at 
> org.glassfish.tests.proxies.org$jboss$weld$bean-$export$work$workspaces$gfv3$v3$distributions$glassfish$target$glassfish3$glassfish$domains$domain1$applications$jsr88-1370237334428885039$-ManagedBean-class_org$glassfish$tests$proxies$TestSessionScopedBean_$$_WeldProxy.<init>(org$jboss$weld$bean-$export$work$workspaces$gfv3$v3$distributions$glassfish$target$glassfish3$glassfish$domains$domain1$applications$jsr88-1370237334428885039$-ManagedBean-class_org$glassfish$tests$proxies$TestSessionScopedBean_$$_WeldProxy.java)
>         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
> Method)
>         at 
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>         at 
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>         at java.lang.Class.newInstance0(Class.java:355)
>         at java.lang.Class.newInstance(Class.java:308)
>         at 
> org.jboss.weld.util.reflection.SecureReflections$16.work(SecureReflections.java:396)
>         at 
> org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
>         at 
> org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInstantiation(SecureReflectionAccess.java:216)
>         at 
> org.jboss.weld.util.reflection.SecureReflections.newInstance(SecureReflections.java:391)
>         at 
> org.jboss.weld.bean.proxy.ProxyFactory.create(ProxyFactory.java:218)
>         at 
> org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:89)
>         at 
> org.jboss.weld.bean.proxy.ClientProxyProvider.access$000(ClientProxyProvider.java:40)
>         at 
> org.jboss.weld.bean.proxy.ClientProxyProvider$1.apply(ClientProxyProvider.java:53)
>         at 
> org.jboss.weld.bean.proxy.ClientProxyProvider$1.apply(ClientProxyProvider.java:44)
>         at 
> com.google.common.collect.ComputingConcurrentHashMap.compute(ComputingConcurrentHashMap.java:206)
> ----

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        
_______________________________________________
weld-issues mailing list
weld-issues@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/weld-issues

Reply via email to