初学动态代理
2016-03-15 16:23
218 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_19746547/article/details/50897514
最近在学习thrift,用到了动态代理,不是很明白,所以稍微学习了一下,记录一下。
package proxyDemo; /** * 我有一套房子,需要出售 * 接口类 * @author sheny * */ public interface myHouseIface { //出售方法 public void saleHouse(); }
package proxyDemo; /** * 出售房子实现类,即委托类 * * @author sheny */ public class myHouseImpl implements myHouseIface { public void saleHouse(){ System.out.println("现房出售,精装修......"); } }
package proxyDemo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 中介类,我将房子交给中介帮我出售 * 中介就是代理类 * @author sheny * */ public class Agency implements InvocationHandler{ //需要将我的房子交给中介,也就是代理类。 private Object myHouse = null; /** * 将房子委托给中介,他们会派出一个代理人来专门负责这个房屋的出售 * * Proxy类: * Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法: * public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) * throws IllegalArgumentException * 参数说明: * ClassLoader loader:类加载器 * Class<?>[] interfaces:得到全部的接口 * InvocationHandler h:得到InvocationHandler接口的子类实例 * @param realHouse * @return */ public Object bindSale(Object realHouse){ this.myHouse = realHouse; return Proxy.newProxyInstance(myHouse.getClass().getClassLoader(), myHouse.getClass().getInterfaces(), this); } /** * @param object 被代理的对象,就是指我 * @param saleHouse 要调用的方法 * @param param 调用方法需要传入的参数 */ public Object invoke(Object object, Method saleHouse, Object[] param) throws Throwable { Object result = null; System.out.println("卖房子前的一些准备工作"); result = saleHouse.invoke(myHouse, param); System.out.println("卖房子后的一些收尾工作"); return result; } }
package proxyDemo; public class myHouseMain { public static void main(String[] args) { //房屋接口的实例对象 myHouseIface myHouse = new myHouseImpl(); //取得代理对象,就是分配好了代理人 Agency agency = new Agency(); myHouseIface saleAgency = (myHouseIface) agency.bindSale(myHouse); //开始卖房子,这时候不需要我去卖了,由代理人去负责出售 saleAgency.saleHouse(); /** * 代理类的invoke()并没有被显示的调用,我的理解是: * bindSale()返回了一个代理对象,就是我这个房子的代理中介, * invoke()就相当是中介内部自己的流程, * 当代理对象调用这个卖房子的方法saleHouse()时,就会自动的执行invoke(),也就是内部自己的流程。 * * 不知道这样理解对不对?? */ } }
还有一些疑问,invoke()中传入的proxy有什么作用?
学习过程中还了解到Cglib动态代理,下次再整理。
这几天再根据实际项目总结一下动态代理。
相关文章推荐
- Spring AOP动态代理初学
- 动态代理(dynamic proxy),初学版
- 动态代理模式
- java的动态代理机制详解 | Java基础
- 使用Cglib创建动态代理
- java中动态代理
- 深入Proxy底层源码——实现自己的JDK动态代理
- Java动态代理学习文章(一)
- JAVA代理模式与动态代理模式
- Java Proxy 和 CGLIB 动态代理原理
- JDK动态代理
- 彻底理解JAVA动态代理
- 动态代理
- 简要梳理springcloud利用动态代理处理服务器之间的降级
- Java学习笔记之动态代理
- mybatis源码分析之mapper动态代理
- 代理模式和Java动态代理机制
- java动态代理(JDK和cglib)
- 又一次闲来无聊,使用Java的动态代理机制来模拟AOP
- java动态代理和AOP_笔记