Java反射—动态代理

Java反射—动态代理

Java中的动态代理给我们提供一种动态生成类的方式,有很好的灵活性,这种技术一般会出现在一些第三方框架中,来降低接入方的使用成本。以下为常用的实现动态代理的几种方式:

  1. JDK自带的Proxy方式

​ 优点:JDK亲儿子;无依赖;使用简单

​ 缺点:代理类必须继承至少一个接口;无法继承已有父类

  1. asm方式,基于class字节码的操作

​ 优点:很底层到操作,性能高,对性能要求苛刻的建议使用

​ 缺点:使用成本高,要熟悉JVM汇编指令

  1. javassist方式,基于class字节码的操作

​ 优点:Api简单,通熟易懂,使用成本低

​ 缺点:性能相对偏低

  1. cglib方式,这个是基于ASM的

​ 优点:Api简单;高性能;高灵活性;支持继承父类;可以不用实现接口

​ 缺点:这个真的很强大,个人感觉比JDK自带的要强大很多,一定要说的话只能说使用这个需要加jar包依赖

最常用的方式就是这几种,由于该系列文章主要介绍Java反射相关的,所以接下来笔者就只介绍JDK自带的Proxy方式。如果对动态代理感兴趣的同学,在这里建议去了解一下cglib(非安利~)


上来直接撸代码了,首先定义一个接口
public interface ICompute {
    int plus(int a, int b);
}
public class ProxyTest implements InvocationHandler {

    public static void main(String[] args) throws Exception {
        new ProxyTest();
    }

    public ProxyTest() {
        ICompute computeObj = (ICompute) Proxy.newProxyInstance(
                ClassLoader.getSystemClassLoader(),
                new Class[]{ICompute.class},
                this
        );
        int result = computeObj.plus(2, 4);
        System.out.println(result);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        int a = (int) args[0];
        int b = (int) args[1];
        return a + b;
    }
}
输出结果:
6

看到这里可能会觉得,敢情绕了一大圈,就实现了一个return a + b的功能,这不是完全的多此一举吗?还不如直接写个return a + b的实现类,现在又要使用动态代理,又要实现一个接口,又要再把方法的参数强转,何必呢~
我们可以仔细看一下Proxy.newProxyInstance()方法,入参是我们预定义的interface,返回值是通过动态代理生成的一个代理类的实例。这说明什么,这说明如果我们正在开发的是一个框架的话,我们可以极大程度上简化使用方的使用成本。
我们结合一下实际情况来想一下,正常情况下我们使用的在做开发的时候经常会需要一些第三方jar包。而这些jar包为了考虑得更周全、更灵活一些,一般情况都是向外提供各种callback、inteceptor和filter的操作,以方便使用方能够在适当的时机来对jar里的流程进行一些AOP操作。而这些AOP操作一般都是通过预定义接口的方式来做的,使用方只需要实现对应的接口并把该实现类注入到jar中的主流程中即可。这里就会涉及到第三方包的通用方式,就是第三方提供interface,让使用方去实现对应的impl,这种工作流程不知道恶心了多少程序猿的日日夜夜。与此相反,如果第三方在合适的场景(场景具有局限性的,不是所有场景都适合)下使用动态代理的方式,那么就是使用方定义接口、使用方调用接口,中间省去的实现类的步骤完全由第三方来实现。往小的说,这是一种IOC的表现形式,往大的说,这是我大developers们认知的一种颠覆!
然而,有心的同学可能已经发现问题,我们使用第三方的jar包,人家包打好了给我们用,然后我们又写自己的接口,回过头来又让他们去实现,最后又再给我们使用,这不是扯淡吗?而且1W个使用方,有NW个接口的定义的情形完全可能,这不是玩大了嘛。的确如此,仅仅凭借动态代理,似乎很难满足我们预想的效果。但是,当我们的动态代理配合注解的使用,就开始真正的强大起来了。关于这个,我们可以预留个坑,接下来会和注解的使用一并进行讲解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值