动态代理的方式及区别

(1)考察目标

考官主要想对JDK动态代理、CGlib动态代理这两种代理进行考核,如两种代理的定义、特点应用等。

(2)题目分析

动态代理:

特点:字节码随用随创建,随用随加载。

作用:不修改源码的基础上,对已有方法增强。

分类:

基于接口的动态代理

基于子类的动态代理

基于接口的动态代理:

要求:被代理类最少实现一个接口

提供者:JDK官方

涉及类:Proxy

创建代理对象的方法:newProxyInstance

方法中的参数:

ClassLoader:类加载器。

负责加载代理对象的字节码。

和被代理对象使用相同的类加载器。

固定写法。

Class[]:字节码数组。

负责让生成的代理对象具有和被代理对象相同的方法。

写什么要看被代理对象是一个接口还是一个实现类。

如果是一个接口:new Class[]{接口}

如果是一个实现类:XXX.getClass().getInterfaces()

固定写法。

InvocationHandler:一个接口,需要我们提供该接口的实现。

作用是用于对方法增强。

增强的代码,谁用谁写。

写的是一个接口的实现类。

通常是一个匿名内部类,但是不绝对。

基于子类的动态代理:

要求:需要导入cglib的坐标。被代理类不能是最终类。(不能被final修饰)

提供者:cglib(第三方)

涉及类:Enhancer

创建代理对象的方法:create

方法中的参数:

Class: 字节码对象。

用于加载代理对象字节码的。

写的是被代理对象的字节码。是固定写法

Callback:如何代理。提供增强代码的。它是个接口,需要自己写实现。

该接口没有方法,需要用它的子接口MethodInterceptor。

(3)应用场景

动态代理的应用场景很多。例如:

1)基于aop思想的方法增强。

2)自定义连接池中,实现Connection的close方法还回池中操作

3)解决全站中文乱码,get和post两种提交方式的。

在get方式需要对以下三个方法增强,用于解决乱码:

String value = getParameter(String name);

String[] value = getParameterValues(String name);

Map map = getParameterMap();

(4)总结

本题主要考察的是

1)动态代理的作用

2)动态代理的特点

3)动态代理的分类

4)两种动态代理的使用要求

点击此处
隐藏目录