JDK与CGLIB的动态代理
日期:2014-08-04点击次数:8482
代理模式是23种java常用设计模式之一。为其他对象提供一种代理以控制对这个对象的访问。可以在下面的场景中使用:权限、缓存、内容传递、错误处理、懒加载、调试、记录跟踪、性能优化、持久化、资源池、同步、事务。
一、JDK动态代理
1.定义目标接口。
public interface ModelManager {
public void addModel(String model);
}
|
2.定义目标类。
public class ModelManagerImpl implements ModelManager {
public void addModel (String model) {
System.out.println("添加模型:"+ model);
}
}
|
3.创建动态代理类。JDK动态代理类需实现java.lang.reflect.InvocationHandler接口。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler{
private Object targetObject;
/*
* 目标对象注入
*/
public JDKProxy(Object targetObject){
this.targetObject = targetObject;
}
/*
* 创建代理对象
*/
public Object getProxyObject(){
Object proxyObject = Proxy.newProxyInstance(
this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
return proxyObject;
}
public Object invoke(Object proxyObject, Method method, Object[] args)
throws Throwable {
beforeHandle ();
Object result = method.invoke(this.targetObject, args); //执行目标对象方法
afterHandle ()
return result;
}
private void beforeHandle (){
System.out.println("在执行目标方法前业务处理");
}
private void afterHandle (){
System.out.println("在执行目标方法后业务处理");
}
}
/**
* 实现类
*/
public class testProxy {
public static void main(String[] args) {
JDKProxy proxy = new JDKProxy(new ModelManagerImpl ());
ModelManager modelManager = (ModelManager) proxy.getProxyObject();
modelManager. addModel ("设备模型");
}
}
|
二、CGLIB动态代理
1.定义目标类。
public class ModelManagerImpl {
public void addModel (String model) {
System.out.println("添加模型:"+ model);
}
}
|
2.创建动态代理类。
CGLIB动态代理类需实现org.aopalliance.intercept.MethodInterceptor接口。
public class CglibProxy implements MethodInterceptor{
private Object targetObject;
public CglibProxy (Object targetObject){
this.targetObject = targetObject;
}
public Object getProxyObject() {
Enhancer enhancer = new Enhancer(); //设置需要创建子类的类
enhancer.setSuperclass(this. targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();// 创建代理对象
}
//实现MethodInterceptor接口方法
public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
beforeHandle ()
Object result = proxy.invokeSuper(obj, args);
afterHandle ()
return result;
}
private void beforeHandle (){
System.out.println("在执行目标方法前业务处理");
}
private void afterHandle (){
System.out.println("在执行目标方法后业务处理");
}
}
}
/**
* 实现类
*/
public class testProxy {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy(new ModelManagerImpl ());
ModelManagerImpl modelManager =(ModelManagerImpl)proxy. getProxyObject ();
modelManager. addModel ("设备模型");
}
}
|
JDK动态代理针对实现了接口的类生成代理,CGLIB是针对类实现代理;因此如果使用JDK动态代理就必须对目标类进行接口定义.
软件部 王涛