首页 > 代码库 > 动态代理
动态代理
面向接口的jdk动态代理(spring默认代理)
package com.yc.advice; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Date; public class LogAdvice implements InvocationHandler { //代理模式中一定要有目标类的引用 private Object tagetObject; //注意这个就是目标类的应用 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用目标的相应方法 Object returnValue=http://www.mamicode.com/method.invoke(tagetObject, args);>package com.yc.advice; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //在这个类使一个且面类。完毕的功能使向目标类的目标方法增加功能(增强) public class RightAdvice implements InvocationHandler{ //代理模式中一定要有目标类的引用 private Object tagetObject; //注意这个就是目标类的应用 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName=method.getName(); if(methodName.startsWith("add")||methodName.startsWith("del")||methodName.startsWith("update")||methodName.startsWith("modify")){ check(); } //调用目标的相应方法 Object returnValue=http://www.mamicode.com/method.invoke(tagetObject, args);>package com.yc.biz; public interface ProductBiz { public void addProduct(); public void delProduct(); public void updateProduct(); public void findProduct(); }package com.yc.biz; //真是主题 public class ProductBizImpl implements ProductBiz { @Override public void addProduct() { System.out.println("************************"); System.out.println("加入产品"); System.out.println("*************************"); } @Override public void delProduct() { System.out.println("************************"); System.out.println("删除产品"); System.out.println("*************************"); } @Override public void updateProduct() { System.out.println("************************"); System.out.println("更新产品"); System.out.println("*************************"); } @Override public void findProduct() { System.out.println("************************"); System.out.println("查找产品"); System.out.println("*************************"); } }package com.yc.biz; import com.yc.advice.LogAdvice; import com.yc.advice.RightAdvice; public class Test { public static void main(String[] args) { RightAdvice ra=new RightAdvice(); LogAdvice la=new LogAdvice(); ProductBiz pb=new ProductBizImpl(); ProductBiz productProxy=(ProductBiz) ra.createInstance(la.createInstance(pb)); productProxy.addProduct(); } }
另一种是面向继承的cglib动态代理首先要导入一个包cglib-nodep-2.1_3.jar
还是上面的样例,可是差别在于增强类的写法上有一点不同,大家看一下
package com.yc.advice; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Date; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class LogAdvice implements MethodInterceptor { //代理模式中一定要有目标类的引用 private Object tagetObject; //注意这个就是目标类的应用 //创建一个方法来完毕创建代理对象 public Object createInstance(Object tagetObject){ this.tagetObject=tagetObject; Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(tagetObject.getClass()); enhancer.setCallback(this); return enhancer.create(); } private void log(Method method, Object[] args, Object tagetObject2){ System.out.println("********************"); System.out.println("日志检查"+new Date()); System.out.println("********************"); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy arg3) throws Throwable { //调用目标的相应方法 Object returnValue=http://www.mamicode.com/method.invoke(tagetObject, args);>package com.yc.advice; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; //在这个类使一个且面类,完毕的功能使向目标类的目标方法增加功能(增强) public class RightAdvice implements MethodInterceptor{ //代理模式中一定要有目标类的引用 private Object tagetObject; //注意这个就是目标类的应用 //创建一个方法来完毕创建代理对象 public Object createInstance(Object tagetObject){ this.tagetObject=tagetObject; Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(tagetObject.getClass().getSuperclass()); enhancer.setCallback(this); return enhancer.create(); } private void check(){ System.out.println("********************"); System.out.println("权限检查"); System.out.println("********************"); } @Override public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable { String methodName=method.getName(); if(methodName.startsWith("add")||methodName.startsWith("del")||methodName.startsWith("update")||methodName.startsWith("modify")){ check(); } //调用目标的相应方法 Object returnValue=http://www.mamicode.com/method.invoke(tagetObject, args);>
想了想静态代理也贴上来了。我认为静态代理便于理解,更直观
和上面不同的是将增强类LogAdvice和RightAdvice两个类替换成了ProductBIzLogProxy和ProductBIzRightProxy两个类
package com.yc.biz; import java.util.Date; public class ProductBIzLogProxy implements ProductBiz{ private ProductBiz productBiz; public ProductBIzLogProxy(ProductBiz productBiz) { // TODO Auto-generated constructor stub this.productBiz=productBiz; } @Override public void addProduct() { // TODO Auto-generated method stub this.productBiz.addProduct(); //后置增强 log(); } private void log(){ System.out.println("%%%%%%%%%%%%"); System.out.println("操作时间"+new Date()); System.out.println("%%%%%%%%%%%%%"); } }package com.yc.biz; //代理类 public class ProductBizRightProxy implements ProductBiz { private ProductBiz productBiz; public ProductBizRightProxy(ProductBiz productBiz) { // TODO Auto-generated constructor stub this.productBiz=productBiz; } @Override public void addProduct() { //增加检查权限的功能 check(); this.productBiz.addProduct(); } //增强的功能 private void check(){ System.out.println("=========================="); System.out.println("检查权限......."); System.out.println("=========================="); } }
測试类改为:package com.yc.biz; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub // ProductBiz pb=new ProductBizRightProxy(new ProductBizImpl()); // pb.addProduct(); ProductBiz pb=new ProductBizRightProxy(new ProductBIzLogProxy(new ProductBizImpl())); pb.addProduct(); } }
动态代理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。