注意:有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了
实例如下:
package com.cglibproxy;
/**
* 1、定义一个Student接口
*/
public interface Student {
//增加学生方法
public void addStudent();
}
package com.cglibproxy;
/**
*2、 学生的实现类,并没有实现接口,所以不能使用jdk动态代理,只能使用cglib动态代理
*
*/
public class StudentImpl {
public void addStudent(){
System.out.println("增加学生的方法.....");
}
}
3、动态代理类实现
package com.cglibproxy;
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 StudentProxy implements MethodInterceptor{
private Object target;
//创建代理对象
public Object getInstance(Object target){
this.target=target;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
//创建代理对象
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("事物开始...");
proxy.invokeSuper(obj, args);
System.out.println("事物结束...");
return null;
}
}
4、测试类
package com.cglibproxy;
public class TestCglibProxy {
/**
* main函数测试cglib动态代理
*/
public static void main(String[] args) {
//StudentImpl studentImpl=new StudentImpl();
StudentProxy studentProxy=new StudentProxy();
StudentImpl student=(StudentImpl)studentProxy.getInstance(new StudentImpl());
student.addStudent();
}
}