java中的代理

在java开发中常用到代理的场景,通俗解释 代理是指 帮助目标对象 去完成目标对象所要完成的事情。比如说 点外卖  目标对象是 顾客 顾客需要点一份米饭从餐馆 外卖小哥 就充当代理对象 帮助顾客取餐 送餐

静态代理

可通过继承或者实现接口完成代理

目标类

public class Customer {

    public String clickOrder(String food){
        return "顾客下单"+food+"成功";
    }
}

代理类

public class PorxyObj extends Customer{

    @Override
    public String clickOrder(String food) {
        super.clickOrder(food);
        System.out.println("外卖接到订单");
        System.out.println("外卖接取到餐");
        System.out.println("外卖接开始配送");
        return "收到"+food;
    }
}

执行代理类

    public static void main(String[] args) {
        Customer customer = new PorxyObj();
        String food = customer.clickOrder("麻辣烫");
        System.out.println(food);
    }

实现接口同理 

静态代理很好的将对象关系做了解耦,但相对于框架本身来说 不利于扩展 ,如果目标对象做了改动,均会影响到代理对象,因此 动态代理应运而生。 

动态代理

1、基于JDK API实现的动态代理(要求目标对象实现接口

定义interface

public interface OrderInterface {

     String clickOrder(String food);
}

定义实现类

public class Customer implements OrderInterface{

    @Override
    public String clickOrder(String food) {
        System.out.println("下单"+food+"成功");
        return food;
    }
}

利用JDK Proxy.newProxyInstance 创建动态代理类 返回 对象为接口类型对象 必须用接口类型接收

    public static void main(String[] args) {
        Customer customer = new Customer();
        OrderInterface orderInterface = (OrderInterface) Proxy.newProxyInstance(customer.getClass().getClassLoader(), customer.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object res =  method.invoke(customer,args);
                System.out.println("外卖接到订单");
                System.out.println("外卖接取到餐");
                System.out.println("外卖接开始配送");
                return "收到"+res;
            }
        });
        System.out.println(orderInterface.clickOrder("大盘鸡"));
    }

2、基于cglib 实现动态代理 (无需实现接口 cglib是基于父类实现的动态代理)

目标类

public class Customer {

    public String clickOrder(String food){
        return "顾客下单"+food+"成功";
    }
}

利用 Enhancer.create 生成动态代理类 由于cglib是基于父类的 所以生成的代理类 类型为 目标对象的子类

    public static void main(String[] args) {
        Customer customer = new Customer();

        Customer customerChild =   (Customer) Enhancer.create(customer.getClass(), new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object res = method.invoke(customer,objects);
                System.out.println("外卖接到订单");
                System.out.println("外卖接取到餐");
                System.out.println("外卖接开始配送");
                return "收到"+res;
            }
        });
        System.out.println(customerChild.clickOrder("蚂蚁上树"));
    }

cglib 对开发者来说 最为简单 但需引入cglib 相关jar包

JDK Proxy 是jdk官方的 无需引入第三方jar包

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值