[weld-issues] [JBoss JIRA] Commented: (WELD-737) Proxy instantiation fails with IllegalAccessError for Beans with package private constructor
Stuart Douglas (JIRA)
jira-events at lists.jboss.org
Sun Oct 24 17:17:54 EDT 2010
[ 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
More information about the weld-issues
mailing list