2008-10-17 18 views
10

Ben dinamik proxyBir proxy kullanırken arabirim ClassLoader'dan görünmüyor mu?

 com.intellij.rt.execution.application.AppMain DynamicProxy.DynamicProxy 
Exception in thread "main" java.lang.IllegalArgumentException: interface Interfaces.IPerson is not visible from class loader 
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) 
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) 
    at DynamicProxy.Creator.getProxy(Creator.java:18) 
    at DynamicProxy.DynamicProxy.main(DynamicProxy.java:54) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

kullanmaya çalıştığınızda aşağıdaki istisna görüyorum Herhangi bir fikir

çözmek için ne yapmam gerekiyor

cevap

5

çözmek için Proxy'yi oluşturduğunuzda geçtiğiniz. Diğer bir deyişle, aynı ada sahip iki sınıf nesneniz vardır ve proxy hangisinin doğru olduğundan emin değildir (aynı olup olmadıkları önemli değildir).

Genellikle, proxy'ye çalıştığınız arabirim, iki farklı sınıf yükleyicisi (yani Tomcat'in 'ortak' ve 'uygulaması') aracılığıyla yüklenen bir kitaplıktayken gerçekleşir.

Bu yardımcı olmuyorsa, lütfen uygulamanızla ilgili daha fazla bilgi gönderin - özellikle herhangi bir uygulama sunucusunu kullanıyorsanız, Spring veya OSGi. Bu, web uygulamasıysa, dinamik proxy oluştururken web uygulaması sınıf yükleyicisini kullanmanız gerekir.

9

Yani, yerine örneğin:

Proxy.newProxyInstance(
    ClassLoader.getSystemClassLoader(), 
    new Class <?>[] {MyInterface.class}, 
    new InvocationHandler() { 
    // (...) 
}); 

deneyin:

Örneğin
Proxy.newProxyInstance(
    this.getClass().getClassLoader(), // here is the trick 
    new Class <?>[] {MyInterface.class}, 
    new InvocationHandler() { 
    // (...) 
}); 

, erkek kedi sınıf yükleyiciler (diğer web konteynerler benzer var) hiyerarşisi takip ediyor:

 Bootstrap 
      | 
     System 
      | 
     Common 
    / \ 
    Webapp1 Webapp2 ... 

Ve bunun web uygulamanızın/WEB-INF/sınıf dizinindeki sınıfları ve kaynakları, web uygulamanızın/WEB-INF/lib dizini altındaki JAR dosyalarındaki sınıfları ve kaynakları içeren webapp sınıf yükleyicisidir. iyon.

İlgili konular