java - 使用代理时,接口(interface)在 ClassLoader 中不可见?

标签 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.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)

知道我需要做什么来解决它

最佳答案

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

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

尝试:

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

例如,tomcat 类加载器的层次结构(其他 Web 容器也有类似的层次结构)如下:

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

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

关于java - 使用代理时,接口(interface)在 ClassLoader 中不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/211176/

相关文章:

java - 在Java正则表达式中向字符类添加方括号

java - 安卓蓝牙连接错误

javascript - 我想使用 javascript 更改 html div 的值

java - 构建动态 Android 布局

python - environment.yml中的pip包如何使用.condarc中提供的代理?

maven - Visual Studio Code 终端无法使用代理

JavaFX ListView 不支持 String.format?

java - 我的堆排序只排列在数组的特定间隔

java - 为每个 XML 子节点动态创建 java 对象?

python - 了解请求模块中的代理参数