ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-27 16:01:59  阅读:562  来源: 互联网

标签:mocking interface implementation 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,因此可以使用参数运行代码以确定是否要记录调用,出于安全原因而阻止调用或任何其他此类事情,而这对于静态实现是非常不可能的.

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

标签:mocking,interface,implementation,java,invocationhandler
来源: https://codeday.me/bug/20191027/1945660.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有