代理模式

本文介绍了静态代理与动态代理的区别,以Java的代理模式为例,详细讲解了如何通过静态代理的静态代理类和动态代理的cglib库来实现功能增强。重点讲述了如何在内容审核场景中使用代理模式,以及cglib在无需接口约束下的代理机制。
摘要由CSDN通过智能技术生成

为什么要有这个模式

比方说你要看一个内容,看这个内容前要审批一下你是不是机器人,这个时候审批的功能就需要代理模式,代理模式也有修饰原来类的感觉。

1.静态代理

静态代理没啥说的,就是新建一个类继承要被修饰的类,然后增加一些附加功能

2.动态代理
一会还要介绍一个cglib代理,动态代理的类必须要实现一个接口类,这是两者的区别

public interface ITeacher {
    public  void teach();
    public  void sayHello(String name);
}

public class Teacher  implements ITeacher {
    @Override
    public void teach() {
        System.out.println("-----开始上课----");
    }

    @Override
    public void sayHello(String name) {
        System.out.println("hello" + name);
    }
}

重要代码

需要被代理类的 class interfaces 还要 弄一个匿名的invocationhanler 去 调用 函数

public class ProxyFactory {
    private Object target;
    public  ProxyFactory(Object target)
    {
        this.target = target;
    }

    public Object getProxyInstance()
    {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始代理");
                Object returnVal = method.invoke(target,args);
                return  returnVal;
            }
        });
    }
}

cglib代理 不需要 实现接口

首先 添加maven依赖

             <dependency>
                 <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                 <version>2.2.2</version>
             </dependency>

然后写一个被代理对象

public class TeacherDao {
    public void teach()
    {
        System.out.println("老师授课中 ,我是cglib代理不需要实现接口");
    }
}

然后调用包代理一下

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class ProxyFactory implements MethodInterceptor {
    private  Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }
    public  Object getProxyInstance()
    {
        //1,.创建工具类
        Enhancer enhancer = new Enhancer();
        //2.设置父类
        enhancer.setSuperclass(target.getClass());
        //3.创建回调函数
        enhancer.setCallback(this);
        //4.创建子类对象,即代理对象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib代理模式开始");
        Object returnValue = method.invoke(target, objects);
        System.out.println("cglib代理对象提交");
        return returnValue;
    }
}

综上,希望对大家有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值