1、回调原理、静态代理原理
public class CallBackFunction {
public static void main(String[] args) {
//回调
ExtendCallClass extendCallClass = new ExtendCallClass();
CallClass callClass = new CallClass();
extendCallClass.extendsMothod(callClass);
//静态代理
B b = new B();
A a = new A(b);
a.method();
}
}
class CallClass{
public void method(){
System.out.println(“回调函数的功能”);
}
}
class ExtendCallClass{
public void extendsMothod(CallClass callClass){
System.out.println(“扩展回调函数前的功能”);
callClass.method();
System.out.println(“扩展回调函数后的功能”);
}
}
interface PublicInterface{
public void method();
}
class A implements PublicInterface{
private PublicInterface publicInterface;
A(PublicInterface pubInterface){
publicInterface = pubInterface;
}
public void method(){
System.out.println("代理前功能");
publicInterface.method();**/*/这里是静态代理,如果用反射,则是可以使用jdk代理,也可以使用cjlib代理***
System.out.println("代理后功能");
}
//}
class B implements PublicInterface{
public void method(){
System.out.println(“代理功能”);
}
}
回调:
功能:通过传递函数参数B,对B功能运行后,进行结果返回或前后扩展
实质:java不支持函数作为参数,但是支持类做参数,通过类把函数进行传递,达到先完成B功能,再继续A功能的过程
优点:A与B的函数名可以不同,灵活性好
代理:
功能:通过把B当做A的一部分,如变成属性,或者通过反射(JVM运行时通过类加载器,类名),获取到代理类的所有信息(构造,方法,属性),然后进行增强扩展
特点:A代理B时,A的方法一定和B一致,AOP时就是要对B的方法(功能)进行前后拦截增强,方便性好
反射:
反射是代理的主要部分,通过虚拟机获取类信息的过程
jdk代理,cjlib代理:
说到静态代理,看上面的代码类似,但是动态代理,有JDK代理,Cjlib代理
JDK代理:只能实现一个,且代理必须是一个接口实现类,因为jdk代理参数就是一个接口做参数,因此不能代理多个
Cjlib代理:可以实现多个,不限于接口类,但是不能用final类进行代理,
jdk,cjlib本质上就是通过虚拟机,获取到类的class信息,并对类信息进行扩展,修改class字节信息
2、拦截器、过滤器
过滤器实现原理是:回调函数,常用来对URL进行过滤,编码等,可以对Request进来前和response返回客户端前进行修改
在springCloud中,网关Zuul中用到了过滤器,也是用到了回调,但不确定是否也用到了反射
拦截器:AOP原理,其实就是动态代理,代理是基于反射,因此书面上大都讲AOP是基于反射实现的
功能:用于校验授权信息,Zuul就是用了过滤器进行授权验证,不太明白