我可以让Java中的'new X()`返回动态代理吗?
我知道我可以编写这样的动态代理:我可以让Java中的'new X()`返回动态代理吗?,java,reflection,proxy,Java,Reflection,Proxy,我知道我可以编写这样的动态代理: public class DecoratedFile implements java.lang.reflect.InvocationHandler { private Object delegate; public static Object newInstance(Object delegate) { return java.lang.reflect.Proxy.newProxyInstance(
public class DecoratedFile implements java.lang.reflect.InvocationHandler {
private Object delegate;
public static Object newInstance(Object delegate) {
return java.lang.reflect.Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new DecoratedFile (delegate));
}
private DecoratedFile (Object delegate) {
this.obj = obj;
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
... do something to `delegate`
}
}
。。。可以这样实例化:
File decorated = DecoratedFile.newInstance(new File("README.txt"));
有没有一种方法可以编写一个类,这样我就可以使用“new”关键字实例化一个动态代理:
例如,在不影响客户端的情况下重构非动态实现
如果答案是“不,你不能”——这背后有设计原则吗?没有
“背后的设计原则”是JLS这样说的
您需要的是工厂模式,或者抽象工厂模式,不管它们之间有什么不同。我一直无法理解为什么它们有两个。我不明白你所说的“在不影响客户机的情况下重构非动态实现”是什么意思。如果能够执行
newdecoratedfile()
而不是DecoratedFile.newInstance()
,您会得到什么好处?@jbnize想象一下,我已经在其他人使用的库中实现了DecoratedFile。该库的几十个用户都在newdecoratedfile()
中浏览他们的代码。如果我将其更改为需要DecoratedFile.newInstance()
我会破坏向后兼容性。File
不是final
类,您可以扩展它。
File decorated = new DecoratedFile(new File("README.txt"));