gpt4 book ai didi

java.lang.reflect.Proxy 和 java.lang.reflect.InitationHandler

转载 作者:行者123 更新时间:2023-12-02 02:08:00 30 4
gpt4 key购买 nike

java.lang.reflect.Proxy 和 java.lang.reflect.InitationHandler 的用途是什么?当我们需要在我们的应用程序上创建和使用它们时?

最佳答案

代理是一种设计模式。当我们想要添加或修改现有类的某些功能时,我们创建并使用代理对象。使用代理对象代替原始对象。通常,代理对象具有与原始对象相同的方法,并且在 Java 中代理类通常扩展原始类。代理有一个原始对象的句柄,可以调用它的方法。

这样代理类就可以方便地实现很多事情:

  1. 记录方法启动和停止的时间
  2. 对参数执行额外检查
  3. 模拟原始类的行为
  4. 获得昂贵的资源

无需修改类原有代码。 (上面的列表并不广泛,仅列出了一些示例)。

要创建一个实际的动态代理类,您所需要做的就是实现java.lang.reflect.InvocationHandler接口(interface):

public Class MyDynamicProxyClass implements
java.lang.reflect.InvocationHandler
{
Object obj;
public MyDynamicProxyClass(Object obj)
{ this.obj = obj; }
public Object invoke(Object proxy, Method m, Object[] args) throws
Throwable
{
try {
// do something
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw e;
}
// return something
}
}

这就是全部!好吧,您还必须拥有实际的代理接口(interface):

public interface MyProxyInterface
{
public Object MyMethod();
}

然后要实际使用该动态代理,代码如下所示:

MyProxyInterface foo = (MyProxyInterface)
java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
Class[] { MyProxyInterface.class },
new MyDynamicProxyClass(obj));

知道上面的代码非常丑陋,我想将其隐藏在某种类型的工厂方法中。因此,我不会在客户端代码中添加那些困惑的代码,而是将该方法添加到我的 MyDynamicProxyClass 中:

static public Object newInstance(Object obj, Class[] interfaces)
{
return
java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
interfaces,
new
MyDynamicProxyClass(obj));
}
That allows me to use the following client code instead:

MyProxyInterface foo = (MyProxyInterface)
MyDynamicProxyClass.newInstance(obj, new Class[]
{ MyProxyInterface.class });

这是更简洁的代码。将来有一个工厂类对客户端完全隐藏整个代码可能是一个好主意,这样客户端代码看起来更像:

MyProxyInterface foo = Builder.newProxyInterface();

总的来说,实现动态代理相当简单。

引用:

关于java.lang.reflect.Proxy 和 java.lang.reflect.InitationHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50461939/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com