我有一个单例对象“ 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方法),然后在所有地方(创建除外)使用该接口。

07-27 14:04