You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Karl Pauls (JIRA)" <ji...@apache.org> on 2017/02/24 13:08:44 UTC

[jira] [Updated] (FELIX-2985) ClassLoading issue involving java.lang.reflect.Proxy in OSGi

     [ https://issues.apache.org/jira/browse/FELIX-2985?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Karl Pauls updated FELIX-2985:
------------------------------
    Fix Version/s:     (was: framework-5.6.4)

> ClassLoading issue involving java.lang.reflect.Proxy in OSGi
> ------------------------------------------------------------
>
>                 Key: FELIX-2985
>                 URL: https://issues.apache.org/jira/browse/FELIX-2985
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-3.0.8
>            Reporter: Sahoo
>         Attachments: proxy-class-loading.zip
>
>
> I am filing this bug after it was determined in the users forum (http://markmail.org/thread/k33oiw3iazfdohj7) that this is a bug that we should track. If there already exists a similar issue, we should merge them into one. The fix may not necessarily be in our domain though.
> JVM requires us to to import more classes than required to define a Proxy class. A simple scenario is shown below:
> module 1:
> package p1;
> public interface A1 extends javax.sql.PooledConnection {
> }
> Export-Package: p1
> Import-Package: javax.sql
> module 2:
> package p2;
> public interface A2 extends javax.naming.Context, p1.A1 {
> }
> Export-Package: p2
> Import-Package: javax.naming, p1
> module 3:
> Bundle-Activator: p3.Activator
> Import-Package: p2, org.osgi.framework
> public class Activator implements BundleActivator {
>    public void start(BundleContext ctx) throws Exception {
>     for (ClassLoader cl : new ClassLoader[]{getClass().getClassLoader(), 
> p2.A2.class.getClassLoader()}) {
>      try {
>       System.out.println(cl);
>       Object obj = Proxy.newProxyInstance(cl, new Class[]{p2.A2.class},
>                  new InvocationHandler() {
>                      public Object invoke(Object proxy, Method method, 
> Object[] args) throws Throwable {return null;}
>                  });
>       System.out.println(obj);
>      } catch(Throwable e) {
>       e.printStackTrace();
>      }
>     } // for
>    }
>    public void stop(BundleContext ctx) throws Exception {}
> }
> It fails like this:
> 3.0
> java.lang.NoClassDefFoundError: javax.naming.Name not found by m3 [3]
>      at $Proxy0.<clinit>(Unknown Source)
>      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.reflect.Proxy.newProxyInstance(Proxy.java:588)
>      at p3.Activator.start(Activator.java:11)
>      at 
> org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:633)
>      at org.apache.felix.framework.Felix.activateBundle(Felix.java:1822)
>      at org.apache.felix.framework.Felix.startBundle(Felix.java:1739)
>      at 
> org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1143)
>      at 
> org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
>      at java.lang.Thread.run(Thread.java:619)
> 2.0
> java.lang.NoClassDefFoundError: javax.sql.StatementEventListener not 
> found by m2 [2]
>      at $Proxy1.<clinit>(Unknown Source)
>      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.reflect.Proxy.newProxyInstance(Proxy.java:588)
>      at p3.Activator.start(Activator.java:11)
>      at 
> org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:633)
>      at org.apache.felix.framework.Felix.activateBundle(Felix.java:1822)
>      at org.apache.felix.framework.Felix.startBundle(Felix.java:1739)
>      at 
> org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1143)
>      at 
> org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
>      at java.lang.Thread.run(Thread.java:619)
> It seems to me that JVM is assuming that the defining loader of the 
> proxy class can load every class that appear in the signature of methods 
> that can be invoked using the proxy class. Anybody interested to debug 
> can use the attached sample. Just unzip and run run.sh after editing 
> path to Felix.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)