Как я могу использовать динамический прокси на конструкторах, которые принимают аргументы? - PullRequest
3 голосов
/ 16 июня 2009

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

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

Я создал прокси так:


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

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

Ответы [ 3 ]

4 голосов
/ 16 июня 2009

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

Если вы посмотрите на пример на странице, на которую ссылаетесь, это приведение к Foo, а не FooImpl.

2 голосов
/ 16 июня 2009

Когда вы хотите создать прокси, вам нужно предоставить интерфейс для реализации. Не конкретный класс.

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

2 голосов
/ 16 июня 2009

Реализует ли ваш класс интерфейс, который вы пытаетесь протестировать? Прокси-классы реализуют методы только из интерфейса. Если вы хотите печатать до / после каждого метода класса (будь то для метрик или отладки), я бы предложил использовать Аспектно-ориентированное программирование (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));
...