Java 使用代理时,类加载器中的接口不可见?

Java 使用代理时,类加载器中的接口不可见?,java,dynamic,proxy,Java,Dynamic,Proxy,当我尝试使用动态代理时,我看到以下异常 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.g

当我尝试使用动态代理时,我看到以下异常

 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)

当您的
DynamicProxy
尝试执行
Class.forName(youInterfaceClass.getName())
时,您知道我需要做什么来解决它吗?

生成的
java.lang.Class
实例与创建代理时传递的实例不同。换句话说,您有两个同名的类对象,而代理不确定哪一个是正确的(不管它们是否相同)

通常,当您试图代理的接口位于通过两个不同类加载器(即Tomcat的“common”和“application”)加载的库中时,就会发生这种情况


如果这没有帮助,请发布有关应用程序的更多信息-特别是如果您使用的是任何应用程序服务器、Spring或OSGi。

如果这是web应用程序,则在创建动态代理时应使用web应用程序类加载器。因此,例如,代替:

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

它是webapp类加载器,它包含WEB应用程序的/WEB-INF/classes目录中的类和资源,以及WEB应用程序的/WEB-INF/lib目录下JAR文件中的类和资源。

我使用spring boot也遇到了同样的问题,我通过注入ResourceLoader来解决它,获得它的类加载器

@Autowired
private ResourceLoader resourceLoader;

....
ClassLoader classLoader = resourceLoader.getClassLoader();
...


Proxy.newProxyInstance(
  classLoader, //for example...
  new Class < ? >[] {MyInterface.class},
  new InvocationHandler() {
  // (...)
});
@Autowired
私有资源加载器;
....
ClassLoader ClassLoader=resourceLoader.getClassLoader();
...
Proxy.newProxyInstance(
类加载器,//例如。。。
新类<?>[{MyInterface.Class},
新的调用处理程序(){
// (...)
});
      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ... 
@Autowired
private ResourceLoader resourceLoader;

....
ClassLoader classLoader = resourceLoader.getClassLoader();
...


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