- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
java.lang.reflect.Proxy 和 java.lang.reflect.InitationHandler 的用途是什么?当我们需要在我们的应用程序上创建和使用它们时?
最佳答案
代理是一种设计模式。当我们想要添加或修改现有类的某些功能时,我们创建并使用代理对象。使用代理对象代替原始对象。通常,代理对象具有与原始对象相同的方法,并且在 Java 中代理类通常扩展原始类。代理有一个原始对象的句柄,可以调用它的方法。
这样代理类就可以方便地实现很多事情:
无需修改类原有代码。 (上面的列表并不广泛,仅列出了一些示例)。
要创建一个实际的动态代理类,您所需要做的就是实现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/
我对这种情况有点困惑: 我有一个类,它实现了标题中提到的 InvocableHandler 接口(interface),该类如下所示: class SimpleProxy implements Inv
java.lang.reflect.Proxy 和 java.lang.reflect.InitationHandler 的用途是什么?当我们需要在我们的应用程序上创建和使用它们时? 最佳答案 代理是
我是一名优秀的程序员,十分优秀!