Java Proxy动态代理浅析
2017-12-18 23:36
295 查看
首先我们需要举栗说明Proxy动态代理类的实际用途:
例如:现在有一位火车乘客,一位黄牛,一座火车站,乘客想要完成买票的动作,他可以到火车站去买,也可以在黄牛手中完成购买火车票的操作,他从黄牛手中买到的票,与火车站买到的票效果相同,这个时候就可以说黄牛是火车站的代理类,黄牛能够间接的调用火车站的功能,同时也能够在卖黄牛票前后插入其他逻辑(比如打广告)来完成切面编程。
动态代理的流程图如下:
例如上图中:
创建一个Server 接口,以及它的业务实现类ServiceImpl(火车站类,GetTicket(args)买票功能实现)及对象ServiceImplObj(火车站对象)。
我们想要得到代理对象,必须要有代理类,本文只是浅析,不做深层源码研究,只需要知道此类是由反射机制自动生成,会实现相应的业务接口即可。
我们需要创建一个MyHandler对象来处理 代理对象即将被调用的某些方法(例如GetTicket)。类似于,AOP中进行函数调用前后插入相关逻辑的地方。
—————————————————-
一次完整的调用过程大概就是这样,接下来附上示例源码:
自此,一个简单的动态代理Demo就完成啦!
例如:现在有一位火车乘客,一位黄牛,一座火车站,乘客想要完成买票的动作,他可以到火车站去买,也可以在黄牛手中完成购买火车票的操作,他从黄牛手中买到的票,与火车站买到的票效果相同,这个时候就可以说黄牛是火车站的代理类,黄牛能够间接的调用火车站的功能,同时也能够在卖黄牛票前后插入其他逻辑(比如打广告)来完成切面编程。
动态代理的流程图如下:
例如上图中:
创建一个Server 接口,以及它的业务实现类ServiceImpl(火车站类,GetTicket(args)买票功能实现)及对象ServiceImplObj(火车站对象)。
我们想要得到代理对象,必须要有代理类,本文只是浅析,不做深层源码研究,只需要知道此类是由反射机制自动生成,会实现相应的业务接口即可。
我们需要创建一个MyHandler对象来处理 代理对象即将被调用的某些方法(例如GetTicket)。类似于,AOP中进行函数调用前后插入相关逻辑的地方。
—————————————————-
MyHandler类中的构造方法会需要传入一个Object,这个Obj就是业务实现对象,代理对象的构造方法中需要传入Handler对象,由此我们可以猜想: 代理对象,handler和业务实现类对象ServiceImplObj存在一个互相绑定的关系,在用户调用代理对象的GetTicket方法时,会调用已绑定的Handler的Invoke方法同时传入参数method(用户调用的方法名),args(调用此方法所需的参数)。然后Handler对象由于已经绑定了ServiceImplObj所以会直接执行其中的对应方法,并返回结果!
一次完整的调用过程大概就是这样,接下来附上示例源码:
Service.java public interface Service { public void getTicket(String s); }
ServiceImpl.java public class ServiceImpl implements Service { @Override public void getTicket(String s) { // TODO Auto-generated method stub System.out.println("get ticket:"+s); } }
MyHandler.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyHandler implements InvocationHandler{ private Object target=null; public MyHandler(Object target) { this.target = target; } @Override public Object invoke(Object obj, Method method, Object[] args) throws Throwable { System.out.println("you can insert something before invoke the method"); Object result=method.invoke(target, args); System.out.println("you can insert something after invoke the method"); return result; } }
import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args){ ServiceImpl sp = new ServiceImpl(); MyHandler mh = new MyHandler(sp); Service s = (Service)Proxy.newProxyInstance(sp.getClass().getClassLoader(),sp.getClass().getInterfaces(), mh); s.getTicket("4:00am"); } }
自此,一个简单的动态代理Demo就完成啦!
相关文章推荐
- Java基础学习总结——动态代理技术(Proxy)
- java中的动态代理Proxy实现AOP
- Java动态代理一------动态类Proxy的使用
- java动态代理和Proxy运用
- Java设计模式-----Proxy模式(动态代理)
- Java动态代理一——动态类Proxy的使用
- Java Reflection深入理解动态代理(Proxy)
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
- java 动态代理学习(Proxy,InvocationHandler)
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- Java动态代理用法(Proxy + InvocationHandler)
- java 动态代理范例 InvocationHandler与Proxy
- java 动态代理学习(Proxy,InvocationHandler)
- Java动态代理--动态类Proxy的使用
- 如何使用Proxy模式及Java内建的动态代理机制 推荐
- java 动态代理深度学习(Proxy,InvocationHandler)
- java 动态代理和静态代理浅析
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- java动态代理浅析
- Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理