2009-06-16 19 views
3

我试过使用他们的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

TheJDK生成的代理与您正在代理的对象的类型不同。相反,它实现了目标对象的相同接口。您需要投射到其中一种接口类型。

如果您查看链接到的页面上的示例,它将投射到Foo而不是FooImpl。

+0

是的。这吸吮:)。我希望DynamicProxy能够做到这一点。 – Geo 2009-06-16 12:53:38

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

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

接口不描述构造函数,所以你想要做什么并不是立即可行的。

相关问题