今天在课堂上,我们正在讨论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,因此可以使用参数运行代码以确定是否要记录调用,出于安全原因而阻止调用或任何其他此类事情,而这对于静态实现是非常不可能的.
上面的示例可能并不十分清楚,但主要是设计问题,而不是一个人能够做其他人不能做的事情.