AOP动态代理的作用:解耦合,提高扩展性;
动态代理的应用场景:测试代码的执行效率,打印日志信息等;
动态代理模式:应用反射技术+代理实现
实现动态代理的核心:InvocationHandler(代理对象的功能方法)
实现原理
实现步骤
1.创建相关的类
2.核心编写代理类的代码
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //关键:设置真实代理对象newProxyInstance,然后去获取代理对象 public class FrankPoxy implements InvocationHandler{ private Object target; public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } //获取代理对象 public Object getPoxy(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } private void doSometingafter() { System.out.println("欢迎下次光临!"); } private void doSometingBefore() { System.out.println("is ok"); } //真实对象执行的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { doSometingBefore(); Object invoke = method.invoke(target, args); System.out.println(invoke); doSometingafter(); return null; }
3.测试结果
测试类代码
public class TestA { public static void main(String[] args) { ClothFactoryImpl clothFactory = new ClothFactoryImpl(); //代理商 FrankPoxy frankPoxy = new FrankPoxy(); //代理的对象 frankPoxy.setTarget(clothFactory); //获取代理对象 ClothFactory poxy = (ClothFactory) frankPoxy.getPoxy(); poxy.buyCloth(); } }
结果