JAVA动态代理 — 代理(Proxy)
3.动态代理
1.什么是动态代理
动态代理是利用反射机制在运行时创建代理类,在程序运行期间创建目标对象的代理对象的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为在编译前并没有代理对象,编译中动态生成代理对象。
2.动态代理方式
- 基于接口的动态代理
提供者:JDK
使用JDK官方的Proxy类创建代理对象
注意:代理的目标对象必须实现接口 - 基于类的动态代理
提供者:第三方 CGLib
使用CGLib的Enhancer类创建代理对象
注意:如果报 asmxxxx 异常,需要导入 asm.jar包
3.JDK动态代理
通过JDK提供的 java.lang.reflect.Proxy 类实现,实现方式:
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
定义公共抽象主题
/**
* 定义人类抽象主题
*/
public interface IHuman {
//人都能吃饭
public void eat();
}
定义主题
/**
* 定义人类具体主题
*/
public class Human implements IHuman{
@Override
public void eat(){
System.out.println("吃饭中。。。");
}
}
定义增强接口
/**
* 定义增强接口
*/
public interface Strengthen{
//方法前干的事 method:需要增强的方法,args:调用该方法的参数列表
public void preAction(Method method, Object[] args)
//方法后干的事 method:需要增强的方法,args:调用该方法的参数列表, ret:该方法返回值
public Object postAction(Method method, Object[] args, Object ret)
}
定义具体增强模版
/**
* 定义具体增强模版
*/
public class StrengthenWithChopsticks implements Strengthen{
//方法前干的事
@Override
public void preAction