4

我尝试使用 Sun 在其 代理使用页面上发布的代码,并尝试使用 DebugProxy 打印调用了哪个方法。问题是,我正在为其创建代理的对象需要有一个参数。如果我尝试使用构造函数的参数创建代理,我会收到以下错误:

线程“主”java.lang.ClassCastException 中的异常:$Proxy0 无法转换为 myPackage.myClass

我创建了这样的代理:


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

如何创建代理实例,并且仍然调用正确的构造函数?

4

3 回答 3

6

JDK 生成的代理与您代理的对象的类类型不同。相反,它实现了目标对象的相同接口。您需要转换为其中一种接口类型。

如果您查看链接到的页面上的示例,它会转换为 Foo,而不是 FooImpl。

于 2009-06-16T12:46:23.903 回答
3

您的类是否实现了您要测试的某些接口?代理类只实现接口中的方法。如果您想在类的每个方法之前/之后打印(无论是用于度量还是调试),我建议使用面向方面的编程 (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));
于 2009-06-16T12:46:50.330 回答
3

当你想创建一个代理时,你需要提供一个接口来实现。不是一个具体的类。

接口不描述构造函数,因此您想要做的事情并不是立即可行的。

于 2009-06-16T12:51:42.567 回答