1、静态代理
代理类和被代理类需要实现相同的接口,被代理类在编译的时候已经确认了他的类。一个代理类只能代理一个类,比较冗余。当被代理类新增方法,对应的接口和代理类也需要处理对应的方法。
2、JDK动态代理
需要代理类实现InvocationHandler接口,实现invoke方法。在编译的时候不知道被代理类的类型,只有在运行期的时候才生成的代理类。基于java反射来实现。动态代理类不需要实现被代理的接口,但是被代理类还是要实现接口才行。
3、CGLIB动态代理
一个三方代理工具,代理类无需实现接口。代理类通过继承生成被代理类的一个子类。代理类需要实现MethodInterceputer接口的interceput方法。
何为反射:
首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制简单说,反射机制值得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
代码如下:
接口类:
public interface Car {
void start();
}
接口实现类,即被代理类:
public class RedCar implements Car {
@Override
public void start() {
System.out.println("启动成功");
}
}
静态代理类:
public class StaticProxyimplements Car {
private Carcar;
public StaticProxy(Car car) {
this.car = car;
}
@Override
public void start() {
System.out.println("插入钥匙");
this.car.start();
System.out.println("开始轰油");
}
}
java动态代理类:
public class JavaDamanicProxyimplements InvocationHandler {
private Objectobj;
public JavaDamanicProxy(Object obj) {
this.obj = obj;
}
@Override
public Objectinvoke(Object proxy, Method method, Object[] args)throws Throwable {
return method.invoke(obj,args);
}
}
cglib动态代理类:
public class CglibDamanicProxyimplements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)throws Throwable {
return methodProxy.invokeSuper(o,objects);
}
}
测试各个代理调用的类:
public static void main(String[] args) {
//静态代理测试
Car redCar=new RedCar();
StaticProxy staticProxy=new StaticProxy(redCar);
staticProxy.start();
//java动态代理
JavaDamanicProxy javaDamanicProxy=new JavaDamanicProxy(redCar);
Car car=(Car)Proxy.newProxyInstance(ProxyTest.class.getClassLoader(), new Class[] {Car.class},javaDamanicProxy);
car.start();
//cglib动态代理
CglibDamanicProxy cglibDamanicProxy=new CglibDamanicProxy();
Enhancer enhancer =new Enhancer();
enhancer.setSuperclass(RedCar.class);
enhancer.setCallback(cglibDamanicProxy);
RedCar redCar1 = (RedCar) enhancer.create();
redCar1.start();
}