实现动态代理的一种方式,和JdK动态代理的区别就是不需要接口,有个非抽象类就够了(这个坑,需要在ssm配好的情况下才能学习测试,Java的基本包里没有)
//输出类
package test;
public class TestA {
public void a(){
System.out.println("你好啊,啦啦啦");
};
}
package test;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglobproxyExample implements MethodInterceptor{
/*
* 生成Cglib代理的类
* @parameter cls 需要代理的类
* @ return Cglib类的代理对象
* */
public Object getProxy(Class cls){
//CGLIB enhancer 增强类对象
Enhancer enhancer = new Enhancer();
//设置增强类型
enhancer.setSuperclass(cls);
//定义代理逻辑对象为当前对象,要求实现MethodInterceptor方法、
enhancer.setCallback(this);
//生成返回代理对象
return enhancer.create();
}
/*
* @param proxy 代理对象
* param method 当前调度方法
* param args 当前方法参数
* return 代理结果返回
* @throws Throwable 异常
* */
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("进入当前逻辑方法");
System.out.println("在调度真实对象之前的服务");
Object result = arg3.invokeSuper(arg0, arg2);
System.out.println("在调度对象之后的服务");
return result;
}
}
//测试类
package test;
public class TestProxy {
public static void main(String[] args) {
CglobproxyExample cbe = new CglobproxyExample();
TestA t = (TestA) cbe.getProxy(TestA.class);
t.a();
}
}
大概和JdK的代理是相似的