2009-06-16 1 views
3

Я попытался использовать код Sun, размещенный на их Proxy usage page, и я попытался использовать DebugProxy для печати, который вызывается. Дело в том, что для объекта, для которого я создаю прокси-сервер, должен быть аргумент. Если я пытаюсь создать прокси-сервер с аргументом конструктора, я получаю следующее сообщение об ошибке:Как я могу использовать динамический прокси-сервер для конструкторов, которые принимают аргументы?

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to myPackage.myClass

Я создал прокси-сервер, как это:


MyClass mc = (MyClass) DebugProxy.newInstance(new MyClass(props)); 

Как я могу создать экземпляр прокси, и все еще вызываете правый конструктор?

ответ

4

Прокси-сервер, созданный с помощью JDK, не имеет тот же тип класса, что и объект, который вы проксимируете. Вместо этого он реализует те же интерфейсы целевого объекта. Вам нужно указать один из этих типов интерфейсов.

Если вы посмотрите на пример на странице, к которой вы привязались, это отличает Foo, а не FooImpl.

+0

Да. это отстой :). Я надеялся, что DynamicProxy будет быстрым способом сделать это. – Geo

+1

Этот прокси-сервер всегда основан на интерфейсах, но другие библиотеки генерации прокси могут напрямую проксировать типы вашего класса. Например, CGLIB может это сделать, и если вы используете прокси CGLIB через ProxyFactory Spring, это весело. Spring ProxyFactory Spring может создавать прокси-серверы JDK или прокси CGLIB, поэтому это полезная абстракция. – skaffman

2

Поддерживает ли ваш класс какой-либо интерфейс, который вы пытаетесь протестировать? Прокси-классы реализуют только методы из интерфейса. Если вы хотите печатать до/после каждого метода класса (будь то для показателей или отладки), я бы предложил использовать Aspect-ориентированное программирование (AOP). Я никогда не делал этого сам, но я слышу, что AspectJ - это то, что вы хотите.

public interface SomeInterface { 
    public void someMethod(); 
} 

public MyClass implements SomeInterface { 
... 
} 

// DebugProxy doesn't return your class, but a class which implements all of the interfaces 
// you class implements 
SomeInterface mc = (SomeInterface) DebugProxy.newInstance(new MyClass(props)); 
2

Если вы хотите создать прокси-сервер, вам необходимо предоставить интерфейс для реализации. Не конкретный класс.

Интерфейсы не описывают конструкторы, поэтому то, что вы хотите сделать, не сразу выполнимо.

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