不扯那些理论书面的东西,毕竟有的时候翻译是二次加密,扯那些容易自己绕晕自己,直接按实际使用时说的来理解。
1.接口回调
首先我们知道,一个接口可以有多种实现,但无论怎么实现,调用都是一样的。即是按照接口名.方法名(参数)。
那么我可以写一个方法,方法的参数是接口,而在传入变量时则传入接口的实现类。
这就是接口回调。
假设这里是调用接口的方法:
public void testInterfaceCall(MyInterface interface){
...
interface.call();
...
}
在这里调用的接口中call方法,但call方法具体怎么实现则是看传入的接口实现类。
这样使用能够提高程序灵活性,也解决了框架开发中的问题:用户需要自定义操作时该如何将用户自定义的操作与已有的部分结合。
2.反射
反射老生常谈了,它的原词是Reflection,个人认为将其理解为映射更好。
简单来说,Java能获取Java类中的各种成分(类名、方法名、属性、方法参数等),并且通过这些成分实现调用某类中某方法。
假设一个使用反射的方法:
public void testReflection(String ClazzName, String methodName){
//通过Class.forName方法获取Class对象
Class<?> clazz = Class.forName(ClazzName);
//通过getMethod(MethodName)方法获取方法
Method method = clazz.getMethod(methodName);
//使用invoke方法运行
method.invoke(clazz.newInstance());
}
这样写的好处是什么呢?
只需要传入ClazzName和methodName,就可以实现调用类中方法的效果。
在进一步,将类名和方法名放入配置文件中,程序中添加通过配置文件获取类名和方法名的方法。这样以后调用指定类中指定方法只需要去修改配置文件中的文件内容即可,不需要对程序进行重新编译。
这也是Spring中IoC的底层实现。