首先说一下我们什么情况下使用代理?
(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。
(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。
(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
---------------------
一,静态代理
package org.rcisoft.business.reflectDemo; /** * @author: wsj * @date: 2018/10/13 * @time: 18:18 */ //静态代理 //接口 public interface StaticReflect { void show(); } //被代理类 class Nike implements StaticReflect{ @Override public void show() { System.out.println("nike开始生产衣服..."); } } //代理类 class ProxyClass implements StaticReflect{ StaticReflect sr; public ProxyClass(StaticReflect st){ this.sr = st; } @Override public void show() { System.out.println("代理类开始执行,收代理费$10"); sr.show(); } } class testStaticReflect{ public static void main(String[] args) { Nike nick = new Nike(); ProxyClass proxyClass = new ProxyClass(nick); proxyClass.show(); } }
二,动态代理
package org.rcisoft.business.reflectDemo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author: wsj * @date: 2018/10/13 * @time: 18:42 */ public interface ProxyTest { } //反射之动态代理 //接口 interface Subject{ void action(); } //被代理类 class RealSubject implements Subject{ @Override public void action() { System.out.println("动态被代理类开始执行啦!..."); } } //代理类 class MyInvocationHandler implements InvocationHandler { Object obj; //实现了被代理类的对象的说明 public Object blind(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { return method.invoke(obj, args); } } class testProxyMethod{ public static void main(String[] args) { RealSubject realSubject = new RealSubject(); MyInvocationHandler myInvocationHandler = new MyInvocationHandler(); Subject subject = (Subject) myInvocationHandler.blind(realSubject); realSubject.action(); } }
原文地址:https://www.cnblogs.com/wsjun/p/9786189.html
时间: 2024-10-27 03:00:40