JDK动态代理的实现原理浅析

本文介绍了JDK动态代理的概念,通过实例展示了如何使用动态代理,包括目标接口、目标对象、InvocationHandler的定义及Proxy.newProxyInstance()的使用。详细解析了Proxy.newProxyInstance()的实现原理,探讨了代理类的生成过程和字节码反编译后的特性,揭示了代理类如何调用InvocationHandler的invoke()方法。
摘要由CSDN通过智能技术生成
JDK动态代理简介

什么是JDK动态代理?
先看看代理的概念——代理:为其他对象提供一种代理以控制对这个对象的访问

代理在生活中很常见,比如买火车票可以不去火车站,而是通过代售点;想要逃课了,就让同学代签到等等。
说白了,就是可以通过代理来完成目标事件。(自我理解)

不同于静态代理直接采用编码的方式实现,JDK动态代理是利用反射机制在运行时创建代理类,进而调用相应的方法。

JDK动态代理的使用

通过一个小例子来看看如何使用JDK动态代理。

目标接口
public interface GameService {

    String beginGame(String s);

    void playGame(String s);
}

目标接口中定义了两个目标方法。

目标对象
public class GamePlay implements GameService {
   

    public String beginGame(String name) {
        System.out.println("玩家" + name + "进入召唤师峡谷,游戏开始!");
        return "玩家名字是:" + name;
    }

    public void playGame(String s) {
        System.out.println("玩家说: " +  s);
    }
}

目标对象是目标接口的实现,也是要被代理的对象。

调用处理器——InvocationHandler
public class GameInvocationHandler implements InvocationHandler {
   

    private Object target;

    //构造方法(可传入目标对象)
    public GameInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //业务逻辑
        System.out.println("before-----欢迎来到——动态召唤师峡谷");

        //方法的返回值(可以为空)
        Object object = method.invoke(target, args);

        //业务逻辑
        System.out.println("after------欢迎离开——动态召唤师峡谷");
        return object;
    }
}

InvocationHandler是调用处理器接口,它只定义了唯一一个 invoke() 方法,通过重写该方法可自定义代理的业务逻辑,该方法三个参数:

  • proxy:代理类对象($Proxy0),在该方法中一般不会用到
  • method:被代理类调用的方法对象
  • args:方法对象中的参数
创建代理类对象——Proxy.newProxyInstance()
public class GamePlayDynamicProxy {


    public static void main(String[] args) {

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值