我有一个单例对象“ MySingle”,在我的所有课程中,我都将其缩编为MySingle.createOrGetInstance();
现在我遇到的问题是,在调用MySingle中的方法之前,我想做一些方法记录和其他工作,所以我研究了Java InvocationHandler类Source Link
但是现在的问题是我将如何调用单例方法,因为当我使用相同的代码而不是执行
DebugProxy.newInstance(new FooImpl());
我做这个
DebugProxy.newInstance(MySingle.createOrGetInstance());
但是,当我这样做时,最终将结果分配给变量`(MySingle sing)时,我得到了一个Cast类表达式。我正在Android上进行开发,但我怀疑这会有所不同:)。
谢谢,
费萨尔阿比德
最佳答案
对于普通的Java应用程序(我不知道android),它将失败,因为java.lang.reflect.Proxy
仅适用于接口!
动态代理类(以下简称为代理类)是一种类,该类实现创建类时在运行时指定的接口列表,其行为如下所述。
@see:Proxy Java Doc
在您的情况下,来自java反射guid(http://download.oracle.com/javase/1.3/docs/guide/reflection/proxy.html)的DebugProxy使用java.lang.reflect.Proxy!
在您的代码中,MySingle
是一个类,但是java.lang.reflect.Proxy
仅实现此类的接口。因此,将为类java.lang.reflect.Proxy
创建的MySingle
强制转换为该类必须MySingle
失败,并出现类强制转换异常,因为代理不是MySingle
的子类。
一个可行的工作方式是:引入一个接口MySingle并实现一个类MySingleImpl(使用getInstance方法),然后在所有地方(创建除外)使用该接口。