美文网首页
2020-03-12 静态代理,jdk 动态代理和cglib动态

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

作者: 稳_zzx | 来源:发表于2020-04-13 14:38 被阅读0次

    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动态

          本文链接:https://www.haomeiwen.com/subject/nryujhtx.html