2008-10-17 5 views
10

я вижу следующее исключение при попытке использовать динамический проксиИнтерфейс не виден с ClassLoader при использовании прокси-сервера?

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) 

Любая идея, что мне нужно сделать, чтобы решить это

ответ

5

Когда ваши DynamicProxy пытается сделать Class.forName(youInterfaceClass.getName()) полученный java.lang.Class экземпляр отличается от тот, который вы передали, когда вы создали прокси. Другими словами, у вас есть два объекта класса с тем же именем, и прокси не уверен, какой из них является правильным (неважно, являются ли они одинаковыми).

Обычно это происходит, когда интерфейс, который вы пытаетесь прокси, находится в библиотеке, загружаемой двумя разными загрузчиками классов (например, «общий» и «приложение» Tomcat).

Если это не поможет, разместите дополнительную информацию о своем приложении - особенно если вы используете любой сервер приложений Spring или OSGi.

9

Если это веб-приложение, то при создании динамического прокси следует использовать загрузчик классов веб-приложений. Так, например, вместо:

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 загрузчиков классов (другие веб-контейнеры имеют аналогичный) следующий:

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

, и это является загрузчиком классов webapp, который содержит классы и ресурсы в каталоге/WEB-INF/classes вашего веб-приложения, а также классы и ресурсы в файлах JAR в каталоге/WEB-INF/lib вашего веб-приложения ион.

 Смежные вопросы

  • Нет связанных вопросов^_^