【java动态代理】动态代理作用与示例


前言

设计模式中有一种叫做代理模式。了解动态代理前先来看看代理模式是什么

一、代理模式

1. 代理模式是什么

简单说就是不直接访问目标对象,提供一个代理用于控制对象访问

2.举个例子

定义接口People

public interface Person {
    void play();
}

实现类 男人

public class Man implements Person{
    @Override
    public void play() {
        System.out.println("打游戏------------------");
    }
}

代理类

public class ManProxy implements Person{
    private Man man;

    public ManProxy(Man man) {
        this.man = man;
    }

    @Override
    public void play() {
        System.out.println("代理对象执行代理方法");
        man.play();
        System.out.println("代理方法执行完毕");
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Man man = new Man();
        //不直接调用man的play方法,通过代理类去调用
        ManProxy manProxy = new ManProxy(man);
        manProxy.play();
    }
}

3.执行测试类可以看到如下结果

在这里插入图片描述
可以看到通过代理类我们也能执行被代理的方法,并且可以进行执行前后进行操作

二、动态代理

动态代理不需要额外编写代理类,可以通过代码动态生成。可以不修改原类进行一些增强。例如aop可以通过这种方式实现

1.实现方式,保留上面的Person接口和Man类

2.创建PersonPlayHandler类实现InvocationHandler接口

public class PersonPlayHandler implements InvocationHandler {
    private Object  target;

    public PersonPlayHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理对象执行代理方法");
        //执行被代理方法
        Object invoke = method.invoke(target, args);
        System.out.println("代理方法执行完毕");
        return invoke;
    }
}

编写测试类

public class Test {
/*    public static void main(String[] args) {
        Man man = new Man();
        //不直接调用man的play方法,通过代理类去调用
        ManProxy manProxy = new ManProxy(man);
        manProxy.play();
    }*/
    public static void main(String[] args) {
        Man man = new Man();
        PersonPlayHandler personPlayHandler = new PersonPlayHandler(man);
        Person instance = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(),
                man.getClass().getInterfaces(),
                personPlayHandler);
        instance.play();
    }
}

执行
在这里插入图片描述
可以看到代理方法成功执行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值