浅谈也许这只是个入门--java动态代理


前言

反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。


前置知识代理模式

场景模拟用户下单调用供应商添加代理日志

1 Demo.java 
2 ProxySubOrder.java 代理日之类 
3 RealSubOrder.java 实现类
4 SubOrder.java 接口 

Demo.java

/**
 * @ClassName Demo
 * @Author xiaojinlu
 * @Date 2020/11/5 17:03
 * @Version 1.0
 */


public class Demo {
    public static void main(String[] args) {
        SubOrder subOrder  = new ProxySubOrder();
        subOrder.getSupplier();
    }
}

ProxySubOrder.java

import org.springframework.beans.factory.annotation.Autowired;

/**
 * 主要添加供应商调用前后日志
 * 代理下单在调用供应商的时候组做些事情
 * @ClassName ProxySubOrder
 * @Author xiaojinlu
 * @Date 2020/11/5 17:07
 * @Version 1.0
 */


public class ProxySubOrder implements SubOrder{

    @Autowired
    private ProxySubOrder proxySubOrder;

    @Override
    public void getSupplier() {
        System.out.println("start invoke supplier");
        //or SubOrder subOrder = new ProxySubOrder(); local Test implement this
        proxySubOrder.getSupplier();
        System.out.println("end invoke supplier");

    }
}

RealSubOrder.java

/**
 * @ClassName RealSubOrder
 * @Author xiaojinlu
 * @Date 2020/11/5 17:06
 * @Version 1.0
 */


public class RealSubOrder implements SubOrder {
    @Override
    public void getSupplier() {
        System.out.println("do Something");
    }
}

SubOrder.java

/** 接口
 * @ClassName SubOrder
 * @Author xiaojinlu
 * @Date 2020/11/5 17:04
 * @Version 1.0
 */


public interface SubOrder {

   void getSupplier();
}

一、定义

在不影响原始代码的情况下对原功能进行功能增强。反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。

二、应用场景

	1.日志
	2.用户鉴权
	3.全局性异常处理
	4.性能监控
	5.事务处理
	等

AOP 通过(动态)代理机制可以让开发者从这些繁琐事项中抽身出来,大幅度提高了代码的抽象程度和复用度。从逻辑上来说,我们在软件设计和实现中的类似代理,如 Facade、Observer 等很多设计目的,都可以通过动态代理优雅地实现。

三、代理分类

----静态代理:事先写好代理类,可以手工编写,也可以工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。

----动态代理:运行时自动生成代理对象。缺点是生成代理对象和调用代理方法都要额外花费时间。

----JDK动态代理:基于Java 反射机制实现,必须要了解接口的业务类型才能用这种办法生成代理对象。新版本也开始结合ASM机制。

----cglib动态代理: 基于ASM机制实现,通过生成业务类的子类作为代理类。

四、扩展

反射机制

① 引入

Java的反射机制在平时的业务开发过程中很少用到,但是在一些基础框架的搭建上应用非常广泛

②什么是Java反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

③反射机制提供了哪些功能

----在运行时判定任意一个对象所属的类

----在运行时构造任意一个类的对象

----在运行时判定任意一个类所具有的成员变量和方法

----在运行时调用任意一个对象的方法

----生成动态代理

④ 反射机制的应用场景

----动态代理(AOP、RPC)

----提供第三方开发者扩展能力(Servlet容器、JDBC连接)

----第三方组件创建对象(OI)

----逆向代码,例如反编译

----与注解相结合的框架,例如Retrofit

----单纯的反射机制应用框架,例如EventBus 2.x

----动态生成类框架 例如Gson

⑤反射机制的优缺点:

----优点:运行期类型的判断,动态类加载,动态代理使用反射

----缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

JDK Proxy 的优势:

最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠。

平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。

代码实现简单。

基于类似 cglib 框架的优势:

有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。

只操作我们关心的类,而不必为其他相关类增加工作量。

高性能。

总结

1 减小了代码的冗余。
2 实现了统一处理的能力。

猜你喜欢

转载自blog.csdn.net/aa327056812/article/details/109511621