我可以让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"));