CGLIB代理
如果要对没有实现接口的类进行代理,可以使用CGLB代理。
CGLIB(Code Generation Library):是一个高性能开源的代码生成包,采用非常底层的字节码技术,对指定的目标类生成一个子类。
这里我们先简单说一下这两种代理方式最大的区别,JDK动态代理是基于接口的方式,换句话来说就是代理类和目标类都实现同一个接口,那么代理类和目标类的方法名就一样了,这种方式上一篇说过了;CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法;
public class UserDao {
public void addUser() {
System.out.println("添加用户---------");
}
public void deleteUser() {
System.out.println("删除用户----------");
}
}
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
//代理方法
public Object createProxy(Object target){
//创建一个动态类对象
Enhancer enhancer = new Enhancer();
//确定需要增强的类,设置其父类
enhancer.setSuperclass(target.getClass());
//添加调回函数
enhancer.setCallback(this);
//返回创建的代理类
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)throws Throwable{
MyAspect myAspect = new MyAspect();
myAspect.check_Premission();
Object obj=methodProxy.invokeSuper(proxy,args);
myAspect.log();
return obj;
}
public class CglibTest {
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
UserDao userDao = new UserDao();
UserDao userDao1=(UserDao)cglibProxy.createProxy(userDao);
userDao1.addUser();
userDao1.deleteUser();
}
}