如何在带参数的构造函数上使用动态代理?

时间:2009-06-16 12:30:44

标签: java dynamic-proxy

我尝试使用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));

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您的类是否实现了您尝试测试的某个界面?代理类仅实现接口的方法。如果你想在类的每个方法之前/之后打印(无论是用于指标还是调试),我建议使用面向方面编程(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 :(得分:2)

如果要创建代理,需要提供实现的接口。不是具体的课程。

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