CGLIb代理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
简单的实现举例:
public class CGLibProxy implements MethodInterceptor {
private Object targetObject;
public Object CreateProxy(Object obj) {
this.targetObject = obj;
Enhancer enhancer = new Enhancer();// 增强类
enhancer.setSuperclass(targetObject.getClass());// 设置父类
enhancer.setCallback(this);//
return enhancer.create(new Class[] { String.class, String.class },
new Object[] { null, null });// ok
// return enhancer.create(targetObject.getClass(), this);// ok,需要无参构造
}
@Override
public Object intercept(Object arg0, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println("\n前置条件及准备工作");
MyLog mylog = method.getDeclaredAnnotation(MyLog.class);
Object obj = null;
if (mylog != null) {
obj = method.invoke(targetObject, args);
Student st = (Student) targetObject;
System.out.println("学生名:" + st.getName() + ",地址:" + st.getAddress()
+ "---被调用了" + method.getName() + "方法");
} else {
System.out.println(method.getName() + "方法,没注解");
}
System.out.println("后置条件及准备工作\n");
return obj;
}
}
注:之前再写的时候发现实体类,必须先生成无参构造,否则报错,超类没有空构造函数,但是没有给出参数,使用上述方法就避免了,他通过实例的有参构造,获取对象.
报错如下:
Exception in thread "main" java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given