2020-03-12 静态代理,jdk 动态代理和cglib动态代理区别

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();

}

你可能感兴趣的:(2020-03-12 静态代理,jdk 动态代理和cglib动态代理区别)