美文网首页
动态代理

动态代理

作者: i小雨 | 来源:发表于2020-11-26 18:09 被阅读0次
  • 动态代理分为两类:
    1、基于接口的动态代理; (JDK动态代理 )
    2、基于类的动态代理;(cglib动态代理)
    3、Java字节码实现。(javassist)

JDK动态代理:

需要了解两个类:Proxy(代理)、InvocationHandler(调用处理程序)
接口:

public interface UserService {
    void addUser();
    void deleteUser();
    void updateUser();
    void selectUser();
}

实现类:

public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("增加了一个User");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除了一个User");
    }

    @Override
    public void updateUser() {
        System.out.println("修改了一个User");
    }

    @Override
    public void selectUser() {
        System.out.println("查询了一个User");
    }
}

创建处理程序类:

//用这个类自动生成动态代理类!
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口(直接写object可以使该类变为通用的)
    private Object target;
    public void setTarget(Object target){
        this.target = target;
    }

    //得到生成的代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);

        log(method.getName());//方法增强(记录日志)
        return result;
    }

    //增强方法
    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

测试类:

public class TestProxy {
    public static void main(String[] args) {

        //真实角色
        UserService userService = new UserServiceImpl();

        //代理角色,不存在
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setTarget(userService);//设置要代理的对象

        //动态生成代理类
        UserService proxy = (UserService) pih.getProxy();

        proxy.addUser();
        proxy.deleteUser();
        proxy.updateUser();
        proxy.selectUser();

    }
}

结果:

增加了一个User
执行了addUser方法
删除了一个User
执行了deleteUser方法
修改了一个User
执行了updateUser方法
查询了一个User
执行了selectUser方法

相关文章

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • Java高级主题(五)——动态代理

    代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...

  • 动态代理

    动态代理分为两类:1、基于接口的动态代理; (JDK动态代理 )2、基于类的动态代理;(cglib动态代理)3、J...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • Java动态代理

    通过以下几种方式介绍动态代理 动态代理涉及到的类 动态代理用法 Proxy类解析 动态代理类解析 动态代理涉及到的...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

  • Java 代理

    静态代理 动态代理 动态代理, 日志切片使用反射获得方法 动态代理, 自定义注解(对注解的方法,使用动态代理添加切...

网友评论

      本文标题:动态代理

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