1.首先要实现MethodInterceptor接口
package com.DesignPattern.CGLIB;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxyFactory implements MethodInterceptor {
private Object object;
public Object createStudent(Object object){
this.object = object;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(object.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
StudentBean stu = (StudentBean)object;
Object result = null;
if(stu.getName() != null)
result = methodProxy.invoke(object, args);
else
System.out.println("方法已经被拦截...");
return result;
}
}
2.添加StudentBean
package com.DesignPattern.CGLIB;
public class StudentBean {
private String name;
public StudentBean(){}
public StudentBean(String name){
this.name = name;
}
public void print(){
System.out.println("Hello World!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.测试类
package com.DesignPattern.CGLIB;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
CGlibProxyFactory factory = new CGlibProxyFactory();
StudentBean stu = new StudentBean();
//stu.setName("熊自超");
StudentBean proxy = (StudentBean) factory.createStudent(stu);
proxy.print();
}
}
4.总结
DK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。 JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。