【发布时间】:2013-10-21 10:36:45
【问题描述】:
问题是:我有一个只有私有构造函数可用的类(我不能修改它的源代码),我需要扩展它。
由于反射允许我们在需要时创建此类的实例(通过获取构造函数并调用 newInstance()),有没有办法创建此类的扩展版本的实例(我的意思是,真的任何方式,即使它是针对 OOP 的)?
我知道,这是一个不好的做法,但看起来我别无选择:我需要拦截对一个类的一些调用(它是一个单例,它不是接口实现,所以动态代理在这里不起作用) .
最小示例(根据要求):
public class Singleton {
static private Singleton instance;
private Singleton() {
}
public static Singleton getFactory() {
if (instance == null)
instance = new Singleton();
return instance;
}
public void doWork(String arg) {
System.out.println(arg);
}}
我想做的就是构建自己的包装器(比如这个)
class Extension extends Singleton {
@Override
public void doWork(String arg) {
super.doWork("Processed: " + arg);
}}
并使用反射将其注入工厂:
Singleton.class.getField("instance").set(null, new Extension());
但我看不到任何构造此类对象的方法,因为它的超类的构造函数是私有的。问题是“这有可能吗”。
【问题讨论】:
-
您是否需要扩展它以用于测试目的或生产代码?
-
这是生产代码:全局问题是与 Eclipse CDT 插件交互并拦截它的所有编译器调用(更有可能是所有 exec(),甚至是从本机代码调用的那些)。没有标准的方法可以做到这一点,看起来最好的解决方案是覆盖它唯一的弱点:ProcessFactory。
-
那为什么不反编译编译好的类呢?!
-
因为最终用户将拥有一个带有私有构造函数的此类版本,而我对此无能为力。
-
实际上是一种仅使用私有构造函数来扩展类的方法,但这只能由内部类完成。
标签: java reflection