- 浏览: 469355 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
mrshen:
很棒,在其他大神的博客上理清了思路看懂之后,来lz这里用例子学 ...
RED-BLACK(红黑)树的实现TreeMap源码阅读 -
a939639017:
yanf4j check不下来 ?
Java nio 2.0 AIO -
hellostory:
又是抄来的 - -
mysql分表方案 -
davidluoye:
为什么不说下支持的数据库呢?
模糊查询的优化 -
oliveevilo:
表示没看懂
Synchronized和java.util.concurrent.locks.Lock的区别
- /**
- * 相亲接口
- *
- * @author zhengt
- * @time Jun 3, 2095 3:13:03 PM
- */
- public interface XiangQinInterface {
- /**
- * 相亲方法
- */
- public void xiangQin();
- }
- /**
- * 张三相亲实现类
- *
- * @author zhengt
- * @time Jun 3, 2095 3:14:48 PM
- */
- public class ZhangSanXiangQinInterfaceImpl implements XiangQinInterface {
- public void xiangQin() {
- System.out.println("张三去相亲,娶个漂亮老婆。");
- }
- }
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- /**
- * 相亲可是一辈子的大事,相亲前要准备一下,打扮得帅气些。
- *
- * @author zhengt
- * @time Jun 3, 2095 3:15:48 PM
- */
- public class ReadyInvocationHandler implements InvocationHandler {
- //相亲接口的实现类,也就是张三相亲类
- private Object zhangSan = null;
- public ReadyInvocationHandler(Object realSubject) {
- this.zhangSan = realSubject;
- }
- public Object invoke(Object proxy, Method m, Object[] args) {
- Object result = null;
- try {
- /**
- * 动态代理类$Proxy0调用xiangQin方法时会调用它自己的xiangQin方法,
- * 而它自己的xiangQin方法里面调用的是super.h.invoke(this, , ),也就是父类Proxy的h的invoke方法,
- * 也就是ReadyInvocationHandler类的invoke方法。
- * 所以,invoke(Object proxy, Method m, Object[] args)种的proxy实际上就是动态代理类$Proxy0,
- * 如果你将其强转成XiangQinInterface然后调用它的xiangQin方法,然后它就会调用super.h.invoke(this, , ),这样就会死循环。
- */
- /**
- * 网上关于这里最多问题就是Object proxy放在这里用来做什么呢?这个我也不知道,
- * 不过至少我们知道它到底是个什么东西,具体做什么用嘛就不得而知了
- */
- System.out.println(proxy.getClass().getSimpleName());
- System.out.println("张三相亲前,代理人给他打扮了打扮。");
- result = m.invoke(zhangSan, args);
- } catch (Exception ex) {
- System.exit(1);
- }
- return result;
- }
- }
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- /**
- * 张三来到了婚介所(相亲现场),开始相亲。
- *
- * @author zhengt
- * @time Jun 3, 2095 3:17:16 PM
- */
- public class HunJieSuo {
- public static void main(String args[]) {
- //先将张三相亲这个相亲的实现类实例化,也就是得到XiangQinInterface接口的一个实例对象
- XiangQinInterface zhangSan = new ZhangSanXiangQinInterfaceImpl();
- /**
- * 得到ZhangSanXiangQinInterfaceImpl这个类的一个代理类,同时为代理类绑定了一个处理类ReadyInvocationHandler。
- * 听着很绕口,其实就是每次调用ZhangSanXiangQinInterfaceImpl这个子类的xiangQin方法时,
- * 不是zhangSan这个ZhangSanXiangQinInterfaceImpl类的实例去调用,
- * 而是这个ZhangSanXiangQinInterfaceImpl的代理类ReadyInvocationHandler去调用它自己的invoke方法,
- * 这个invoke方法里呢可以调用zhangSan这个实例的xiangQin方法
- */
- /**
- * 在java种怎样实现动态代理呢
- * 第一步,我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象,
- * 所谓代理呢也就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。
- * 第二步,我们要自己写一个在要代理类的方法执行时,能够做额外工作的类,而这个类必须继承InvocationHandler接口,
- * 为什么要继承它呢?因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法,
- * 而是转而调用这个类的invoke方法(继承时必须实现的方法),在这个方法中你可以调用真正的实现类的这个方法。
- * 第三步,在要用代理类的实例去调用实现类的方法的时候,写出下面两段代码。
- */
- XiangQinInterface proxy = (XiangQinInterface) Proxy.newProxyInstance(
- zhangSan.getClass().getClassLoader(),
- zhangSan.getClass().getInterfaces(),
- new ReadyInvocationHandler(zhangSan));
- proxy.xiangQin();
- /**
- * 这里要解释下中部那段长长的代码的意思,以及具体做了哪些工作?
- * 第一,根据zhangSan.getClass().getClassLoader()这个要代理类的类加载器和
- * zhangSan.getClass().getInterfaces()要代理类所实现的所有的接口
- * 作为参数调用Proxy.getProxyClass(ClassLoader loader, Class<?>... interfaces)
- * 的方法返回代理类的java.lang.Class对象,也就是得到了java动态生成的代理类$Proxy0的Class对象。
- * 同时,java还让这个动态生成的$Proxy0类实现了要代理类的实现的所有接口,并继承了Proxy接口。
- * 第二,实例化这个动态生成的$Proxy0类的一个实例,实例化代理类的构造函数为Proxy(InvocationHandler h),
- * 也就是说要实例化这个动态生成的$Proxy0类,必须给它一个InvocationHandler参数,也就是我们自己实现的用来在代理类
- * 方法执行前后做额外工作的类ReadyInvocationHandler。
- * 这段代码Proxy.newProxyInstance(zhangSan.getClass().getClassLoader(),zhangSan.getClass().getInterfaces(),new ReadyInvocationHandler(zhangSan))
- * 得到的其实是一个类名叫$Proxy0 extends Proxy implements XiangQinInterface的类。
- * 第三,将这个$Proxy0类强制转型成XiangQinInterface类型,调用xiangQin方法。
- */
- }
- }
/** * 相亲接口 * * @author zhengt * @time Jun 3, 2095 3:13:03 PM */ public interface XiangQinInterface { /** * 相亲方法 */ public void xiangQin(); } /** * 张三相亲实现类 * * @author zhengt * @time Jun 3, 2095 3:14:48 PM */ public class ZhangSanXiangQinInterfaceImpl implements XiangQinInterface { public void xiangQin() { System.out.println("张三去相亲,娶个漂亮老婆。"); } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 相亲可是一辈子的大事,相亲前要准备一下,打扮得帅气些。 * * @author zhengt * @time Jun 3, 2095 3:15:48 PM */ public class ReadyInvocationHandler implements InvocationHandler { //相亲接口的实现类,也就是张三相亲类 private Object zhangSan = null; public ReadyInvocationHandler(Object realSubject) { this.zhangSan = realSubject; } public Object invoke(Object proxy, Method m, Object[] args) { Object result = null; try { /** * 动态代理类$Proxy0调用xiangQin方法时会调用它自己的xiangQin方法, * 而它自己的xiangQin方法里面调用的是super.h.invoke(this, , ),也就是父类Proxy的h的invoke方法, * 也就是ReadyInvocationHandler类的invoke方法。 * 所以,invoke(Object proxy, Method m, Object[] args)种的proxy实际上就是动态代理类$Proxy0, * 如果你将其强转成XiangQinInterface然后调用它的xiangQin方法,然后它就会调用super.h.invoke(this, , ),这样就会死循环。 */ /** * 网上关于这里最多问题就是Object proxy放在这里用来做什么呢?这个我也不知道, * 不过至少我们知道它到底是个什么东西,具体做什么用嘛就不得而知了 */ System.out.println(proxy.getClass().getSimpleName()); System.out.println("张三相亲前,代理人给他打扮了打扮。"); result = m.invoke(zhangSan, args); } catch (Exception ex) { System.exit(1); } return result; } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 张三来到了婚介所(相亲现场),开始相亲。 * * @author zhengt * @time Jun 3, 2095 3:17:16 PM */ public class HunJieSuo { public static void main(String args[]) { //先将张三相亲这个相亲的实现类实例化,也就是得到XiangQinInterface接口的一个实例对象 XiangQinInterface zhangSan = new ZhangSanXiangQinInterfaceImpl(); /** * 得到ZhangSanXiangQinInterfaceImpl这个类的一个代理类,同时为代理类绑定了一个处理类ReadyInvocationHandler。 * 听着很绕口,其实就是每次调用ZhangSanXiangQinInterfaceImpl这个子类的xiangQin方法时, * 不是zhangSan这个ZhangSanXiangQinInterfaceImpl类的实例去调用, * 而是这个ZhangSanXiangQinInterfaceImpl的代理类ReadyInvocationHandler去调用它自己的invoke方法, * 这个invoke方法里呢可以调用zhangSan这个实例的xiangQin方法 */ /** * 在java种怎样实现动态代理呢 * 第一步,我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象, * 所谓代理呢也就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。 * 第二步,我们要自己写一个在要代理类的方法执行时,能够做额外工作的类,而这个类必须继承InvocationHandler接口, * 为什么要继承它呢?因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法, * 而是转而调用这个类的invoke方法(继承时必须实现的方法),在这个方法中你可以调用真正的实现类的这个方法。 * 第三步,在要用代理类的实例去调用实现类的方法的时候,写出下面两段代码。 */ XiangQinInterface proxy = (XiangQinInterface) Proxy.newProxyInstance( zhangSan.getClass().getClassLoader(), zhangSan.getClass().getInterfaces(), new ReadyInvocationHandler(zhangSan)); proxy.xiangQin(); /** * 这里要解释下中部那段长长的代码的意思,以及具体做了哪些工作? * 第一,根据zhangSan.getClass().getClassLoader()这个要代理类的类加载器和 * zhangSan.getClass().getInterfaces()要代理类所实现的所有的接口 * 作为参数调用Proxy.getProxyClass(ClassLoader loader, Class<?>... interfaces) * 的方法返回代理类的java.lang.Class对象,也就是得到了java动态生成的代理类$Proxy0的Class对象。 * 同时,java还让这个动态生成的$Proxy0类实现了要代理类的实现的所有接口,并继承了Proxy接口。 * 第二,实例化这个动态生成的$Proxy0类的一个实例,实例化代理类的构造函数为Proxy(InvocationHandler h), * 也就是说要实例化这个动态生成的$Proxy0类,必须给它一个InvocationHandler参数,也就是我们自己实现的用来在代理类 * 方法执行前后做额外工作的类ReadyInvocationHandler。 * 这段代码Proxy.newProxyInstance(zhangSan.getClass().getClassLoader(),zhangSan.getClass().getInterfaces(),new ReadyInvocationHandler(zhangSan)) * 得到的其实是一个类名叫$Proxy0 extends Proxy implements XiangQinInterface的类。 * 第三,将这个$Proxy0类强制转型成XiangQinInterface类型,调用xiangQin方法。 */ } }
网上看到一个牛人读过这个动态代理的源代码,现把网址留在这里,希望对网友们有帮助。
http://hi.baidu.com/malecu/blog/item/45d4952b31bc0e27d52af17a.html
发表评论
-
Integer“==”和Integer“equals”
2013-09-01 12:37 1280以前有碰到Integer“==”和Integer“eq ... -
java枚举类型enum的使用
2013-08-07 09:57 8996分类: java2011-04-24 23:17 6 ... -
线上TOMCAT,JAVA参数配置
2013-06-08 11:57 1355export JAVA_HOME=/export/serve ... -
HttpUrlConnection不能设置Host
2013-06-05 18:01 2768调试了一天终于找到原因了,奶奶的!! 测试就报503错误, ... -
Java访问https接口实现
2013-03-05 22:06 4790用两种方式分别实现了,第一种是jdk原生的,代码稍微多点, ... -
深入理解HASHMAP
2013-01-06 11:48 1073Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到 ... -
Commons-Validator验证框架2
2012-11-29 14:00 1428Commons-Validator 博客分类: java ... -
java concurrent 探秘
2012-08-06 16:44 899我们都知道,在JDK1.5 ... -
ReentrantLock与syncronized的不同
2012-08-06 14:22 1171ReentrantLock 一个可重入的互斥锁定 ... -
log4j 日志大小
2012-08-03 17:47 1923今天群里一个哥们问一个问题: 我想先控制每天日 ... -
Apache Commons 包含的开源的工具类介绍
2012-07-24 10:17 1263原文地址:http://blog.csdn.n ... -
JAVA工具类之Apache的Commons Lang和Beanutils
2012-07-24 10:09 1426Apache Commons包估计是Java中使用最广发的工具 ... -
批处理启动JAVA程序(多JAR包)
2012-06-16 11:01 2280JavaJVMF# . 直接给出代码吧,下面是我自己为一个端口 ... -
中高级技术人员面试
2012-08-06 14:23 1362struts,spring,hiberate知识点。实际上对于 ... -
IO深度解析
2011-11-04 15:49 1157http://www.ibm.com/developerwor ... -
线程局部存储Thread Local Storage-TLS(总结整理)
2011-10-27 18:18 1783在线程的学习中我们知道每个线程除了共享进程的资源外还拥有各 ... -
正确理解ThreadLocal
2011-10-27 18:17 894http://www.iteye.com/topic/1038 ... -
读源码的建议
2011-10-11 22:01 1378才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅读 ... -
java synchronized详解
2011-09-02 13:53 922Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候 ... -
开发中的陷阱
2011-09-02 09:58 9311. 虚拟机对字符串的处理 虚拟机是将字符串直 ...
相关推荐
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用真实目标对象的方法时添加额外的功能或行为。在这个实例中,我们将深入探讨Java动态代理的核心概念,...
Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理主要应用于面向切面编程(AOP)和事件监听等场景,使得代码更加模块化,易于维护。以下是...
Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...
本篇文章将深入探讨Java动态代理的概念、原理以及如何通过一个简单的"Hello, World!"示例来理解它。 动态代理,顾名思义,是在程序运行时动态地生成代理对象。与静态代理(编译时已知)相比,动态代理更加灵活,...
JDK 动态代理JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来支持动态代理。Proxy 类用于创建一个代理对象,而 InvocationHandler 接口则定义了代理对象的方法调用处理逻辑。...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用方法时添加额外的功能或控制。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等。...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...
java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...
Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现指定的接口。这一机制使得我们可以在不修改已有代码的情况下,为已有接口增加额外的功能或者增强已有功能的行为。在Java中,动态...
Java动态代理机制的优点在于灵活性和便捷性,它允许在运行时动态创建符合特定接口的代理对象,无需对原有代码做任何修改,使得我们可以方便地实现诸如日志、事务控制等跨切面的逻辑。不过,动态代理仅限于代理接口,...
Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...
### Java动态代理知识点详解 #### 一、Java动态代理简介 在Java中,动态代理是一种非常重要的机制,它允许我们在运行时动态地创建一个接口的实现类实例。这种技术广泛应用于AOP(面向切面编程)、RPC(远程过程...
Java动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建代理对象来代替目标对象,以便在不修改原有代码的情况下对目标对象的行为进行增强或扩展。在Java.lang.reflect包下,动态代理主要涉及两个核心...
对代理模式与Java动态代理类的理解说明
总之,基于Java动态代理和反射机制实现ORM,可以有效地解耦业务逻辑和数据库操作,提高代码的可读性和可维护性。虽然现有的ORM框架如Hibernate、MyBatis已经相当成熟,但对于学习和理解Java的高级特性,这样的实践...
Java动态代理是Java语言提供的一种机制,它允许在运行时创建一个对象的代理,这个代理对象可以在调用实际方法之前和之后添加额外的功能。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....