美文网首页
代理模式

代理模式

作者: 用户zzzzzz | 来源:发表于2022-08-28 14:33 被阅读0次
    image.png

    应用场景

    代理模式
    Service层、事务处理 @Transactional 底层AOP代理-JDK动态代理

    1.静态代理

    2.动态代理

    动态代理允许使用一种方法的单个类(代理类)为具有任意数量方法的任意类(真实类)的多个方法调用提供服务,看到这句话,可以容易的联想到动态代理的实现与反射密不可分。
    JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

    1.jdk动态代理(接口代理)
        Jdk代理涉及到java.lang.reflect包中的InvocationHandler接口和Proxy类,核心方法是

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
    

    jdk动态代理过程中实际上代理的是接口,是因为在创建代理实例的时候,依赖的是java.lang.reflect包中Proxy类的newProxyInstance方法,该方法的生效就恰恰需要这个参数;

    public static Object newProxyInstance(ClassLoader loader,
                                              Class<?>[] interfaces,
                                              InvocationHandler h)
            throws IllegalArgumentException{
            ……
            }
    

    2.cglib动态代理
        从上面可以看出,jdk动态代理的前提条件是,要有接口存在,那还有许多场景是没有接口的,这个时候就需要cglib动态代理了,CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理。

    //所需的代理类
    import java.lang.reflect.Method;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    public class CglibProxy implements MethodInterceptor {
        private Enhancer enhancer=new Enhancer();
        private Object bean;
    
        public CglibProxy(Object bean) {
            this.bean = bean;
        }
    
        public Object getProxy(){
            //设置需要创建子类的类
            enhancer.setSuperclass(bean.getClass());
            enhancer.setCallback(this);
            return enhancer.create();
    
        }
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            String methodName = method.getName();
            if (methodName.equals("wakeup")){
                System.out.println("早安~~~");
            }else if(methodName.equals("sleep")){
                System.out.println("晚安~~~");
            }
            return method.invoke(bean,objects);
        }
    }
    
    

    区别:

    image.png
    image.png image.png image.png image.png

    **静态代理和动态代理的根本区别


    image.png

    相关文章

      网友评论

          本文标题:代理模式

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