一.cglib东动态代理
1.通过net.sf.cglib.proxy.Enhancer动态生成代理对象
2.需要实现net.sf.cglib.proxy.MethodInterceptor接口
二.上代码
1.需要导入的jar包:asm-2.2.3.jar和cglib-nodep-3.2.5.jar
2.目标类:TargetObject.java
package com.tiglle.cglib.dynamic.proxy;
//目标类
public class TargetObject{
public String medhod1(String str) {
System.out.println("方法1");
return str;
}
public String method2(String str) {
System.out.println("方法2");
return str;
}
}
3.MethodInterceptor的子类:CglibObject.java
package com.tiglle.cglib.dynamic.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//创建MethodInterceptor的实现类
public class CglibObject implements MethodInterceptor{
//实现intercept方法
@Override
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("前置:before");
Object result = null;
try {
//使用方法反射调用目标对象方法
result = proxy.invokeSuper(target, args);
System.out.println("返回通知:AfterReturning");
} catch (Exception e) {
System.out.println("异常通知:AfterThrowing");
}finally{
System.out.println("后置通知:After1");
}
System.out.println("后置通知:After2");
return result;
}
}
4.测试使用:UseExec.java
package com.tiglle.cglib.dynamic.proxy;
import net.sf.cglib.proxy.Enhancer;
public class UseExec {
public static void main(String[] args) {
//调用
//创建动态生成代理对象(目标对象的子类)的类Enhancer
Enhancer enhancer = new Enhancer();
//设置目标对象(生成的代理类为其子类)
enhancer.setSuperclass(TargetObject.class);
//指定一个回调函数,这个函数就和Proxy的 invoke()类似
enhancer.setCallback(new CglibObject());
//生成代理类,向上转型,实际上调用的时代理类(子类)的方法
TargetObject dynamicProxy = (TargetObject) enhancer.create();
//调用代理类的方法
dynamicProxy.medhod1("小明");
dynamicProxy.method2("小红");
}
}
运行结果:
前置:before
方法1
返回通知:AfterReturning
后置通知:After1
后置通知:After2
前置:before
方法2
返回通知:AfterReturning
后置通知:After1
后置通知:After2