Java动态代理Proxy
来源:互联网 发布:企业数据库er图 编辑:程序博客网 时间:2024/05/17 12:55
接口
package org.leo.proxy;/** * @author Leo.Chen */public interface XiangQin {String xiangQin(String guNiang);}
针对接口的某种具体实现
package org.leo.proxy;/** * realSubject */public class LeoXiangQin implements XiangQin {@Overridepublic String xiangQin(String guNiang) {System.out.println("Leo 和 " + guNiang + " 去相亲了。");return "successed! ";}}
实现JDK定义的处理动态代理整个过程的接口
/** * */package org.leo.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * @author Leo.Chen * */public class XiangQinInvocationHandler implements InvocationHandler {private XiangQin xiangQin;public XiangQinInvocationHandler(final XiangQin xiangQin) {super();this.xiangQin = xiangQin;}/** * proxy : com.sun.proxy.$Proxy0 代理类 * method: 接口中定义的方法对象 * args: 接口方法入参 * Object: 方法调用返回结果 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {doBefore();/*proxy 是代理对象$Proxy0 extends Proxy implements XiangQin的类, * 如果proxy cast为XiangQin, * 然后执行接口method,将会出现死循环 *//** * 为什么出现死循环? * 动态代理类$Proxy0调用execute方法时会调用$Proxy0它自己的xiangQin方法 * 而它自己的execute方法里面调用的是super.h.invoke(this,method,args), * 也就是父类Proxy的h(InvocationHandler)的invoke方法, * 即XiangQinInvocationHandler的invoke方法,方法中不断的重复调用自己 *//*((XiangQin)proxy).execute("美女");*/System.out.println("proxy:"+proxy.getClass().getCanonicalName());System.out.println("method:"+method.getName()+",returnType:"+method.getReturnType().getCanonicalName());/*result为方法调用返回结果*/Object result = method.invoke(xiangQin, args);System.out.println("result's type :"+result.getClass().getCanonicalName());doAfter();return result;}protected void doBefore(){System.out.println("before:相亲之前打扮自己。");}protected void doAfter(){System.out.println("after:相亲成功了。");}}
代理工具类
package org.leo.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class ProxyXiangQin {public static void main(String[] args) { /** * 在java种怎样实现动态代理呢 * 第一步,我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象, * 所谓代理呢也就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。 * 第二步,我们要自己写一个在要代理类的方法执行的前后可以做额外工作的类,而这个类必须继承InvocationHandler接口, * 为什么要继承它呢?因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法, * 而是转而调用这个类的invoke方法(继承时必须实现的方法),在这个方法中你可以调用真正的实现类的这个方法。 * 第三步,在要用代理类的实例去调用实现类的方法的时候,写出下面两段代码。 */ XiangQin qin = new LeoXiangQin();InvocationHandler handler = new XiangQinInvocationHandler(qin);XiangQin proxy = (XiangQin) Proxy.newProxyInstance(qin.getClass().getClassLoader(), qin.getClass().getInterfaces(), handler);String result = proxy.execute("美女");System.out.println("result:"+result);}
参考文章:
http://www.iteye.com/topic/683613
- Java Proxy动态代理
- Java 动态代理 Proxy
- Java动态代理Proxy
- java动态代理-InvocationHandler Proxy
- Java动态代理InvocationHandler+Proxy
- java动态代理proxy ,cglib
- java 动态代理Dynamic proxy
- Proxy实现java动态代理
- Java动态代理Proxy学习
- java dynamic proxy 动态代理
- Java的动态代理Proxy
- Java Proxy动态代理浅析
- java中Proxy(代理与动态代理)
- java中Proxy(代理与动态代理)
- Java动态代理(Java Dynamic Proxy)
- java 动态代理 [Java Dynamic Proxy]
- Java的代理(Proxy)-静态代理和动态代理
- 动态代理(Dynamic Proxy)Java Servlet
- 【初学者】servlet读取配置文件
- C# Socket TCP 客户/服务端例子
- 改变android虚拟机的存放路径
- Linux 资源暂时不可用
- 关系代数中的除法--概念的理解
- Java动态代理Proxy
- MySQL存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试
- poj 3263 Tallest Cow
- DOS操作命令
- hdu 题目1496 Equations , POJ 题目1840 Eqs (整数Hash)
- Uva - 11178 - Morley's Theorem
- [20130828]The Economist
- request 获取各种路径
- dstat 使用