JAVA:与接口的实现相比,InvocationHandler的优点是什么?

今天在课堂上,我们正在讨论Java编程中的反思.今天的课程的一部分是关于在Java中使用InvocationHandlers的,而不仅仅是实现接口.
当我问老师使用调用处理程序有什么好处时,没有一个明确的答案.
假设我们有一个界面插件

public interface Plugin {
    void calculate(double a, double b);
    String getCommand();
}

您可以在Multiply类中轻松实现此接口

public class Multiply implements Plugin {
    @Override
    public void calculate(double a, double b){
         return a * b;
    }

    @Override
    public String getCommand(){
         return "*";
    }
}

那为什么我还要使用InvocationHandler的另一个实现呢?

 public class MyMock {
     public static Object createMock(Class myClass) {
         InvocationHandler handler = new MyInvocationHandler();
         Object result = Proxy.newProxyInstance(myClass.getClassLoader(), new Class[]{myClass}, handler);
         return result;
     }
 }

提前致谢 :)

解决方法:

代理是一个动态代理,这意味着它在运行时为您提供了很大的灵活性,而对于接口和实现类,一切都需要在编译时确定.

例如,假设由于某种原因,您希望在夜间将某些方法调用的返回值重写为null.如果要静态实现它,则需要使用类似以下内容的方法将逻辑写入所有类中

if(isNight())
    return null;
return normalValue;

但是,使用代理服务器,您可以将上述逻辑写入InvocationHandler中,普通类甚至都不知道它们的值不在夜间使用.这还允许您具有多个InvocationHandlers,因此可以使用参数运行代码以确定是否要记录调用,出于安全原因而阻止调用或任何其他此类事情,而这对于静态实现是非常不可能的.

上面的示例可能并不十分清楚,但主要是设计问题,而不是一个人能够做其他人不能做的事情.

上一篇:java-扩展Graphics2D类而不实现所有方法


下一篇:Jenkins集成Android apk编译