JDK动态代理
//1.影星接口
package com.entity; //影星接口 public interface MovieStar { public void act();//演戏 }
//2.被代理类----实现一个接口
package com.entity; //成龙 public class ChengLongStar implements MovieStar{ @Override public void act() { System.out.println("我是成龙,我会拍戏"); } }
//3.代理类----实现InvocationHandler接口
package com.entity; import java.lang.reflect.InvocationHandler;//java的设计模式 import java.lang.reflect.Method; import java.lang.reflect.Proxy; //成龙的经纪人类 public class ChengLongProxy implements InvocationHandler{ //被代理的原始对象 private Object orientObject;//被代理对象 //绑定被代理对象,返回一个代理对象 public Object bind(Object obj){ this.orientObject=obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } //演戏之前要做的事情 public void beforeAct(){ System.out.println("谈档期..."); System.out.println("谈片酬..."); System.out.println("谈广告合作..."); System.out.println("签合同..."); } //演戏之后要做的事情 public void afterAct(){ System.out.println("出席首映式..."); System.out.println("出席颁奖典礼..."); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result; beforeAct(); //调用成龙的演戏方法 result=method.invoke(this.orientObject,null);//利用反射调用方法 afterAct(); return result; } }
//4.测试类
package com.entity; import org.junit.Test; public class ChengLongProxyTest { @Test public void fun1(){ //创建成龙对象 MovieStar chengLong=new ChengLongStar(); //成龙经纪人对象 ChengLongProxy proxy=new ChengLongProxy(); //把成龙和成龙经纪人绑定,返回有经纪人的成龙对象 chengLong= (MovieStar) proxy.bind(chengLong); chengLong.act(); } }
//结果
谈档期... 谈片酬... 谈广告合作... 签合同... 我是成龙,我会拍戏 出席首映式... 出席颁奖典礼...
CGLIB是借助反编译实现的
1.抽象类
package com.entity; //影星抽象类 public abstract class MovieStar { //抽象方法 public abstract void act();//演戏 }
2.被代理类
package com.entity; //成龙 public class ChengLongStar extends MovieStar{ @Override public void act() { System.out.println("我是成龙,我会拍戏"); } }
3.代理类
package com.entity; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; //成龙的经纪人类 public class ChengLongProxy implements MethodInterceptor { // 被代理对象 public Object orientObject;// public Object bind(Object obj) { this.orientObject = obj; Enhancer enhancer = new Enhancer(); // 获得被代理对象的父类 enhancer.setSuperclass(obj.getClass().getSuperclass()); enhancer.setCallback(this); return enhancer.create();// 返回一个代理对象 } // 演戏之前要做的事情 public void beforeAct() { System.out.println("谈档期..."); System.out.println("谈片酬..."); System.out.println("谈广告合作..."); System.out.println("签合同..."); } // 演戏之后要做的事情 public void afterAct() { System.out.println("出席首映式..."); System.out.println("出席颁奖典礼..."); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { Object result; beforeAct(); //调用成龙演戏 result=method.invoke(orientObject, null); afterAct(); return result; } }
4.测试结果:
谈档期... 谈片酬... 谈广告合作... 签合同... 我是成龙,我会拍戏 出席首映式... 出席颁奖典礼...
来源:https://www.cnblogs.com/xjs1874704478/p/11212102.html