- 浏览: 115407 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (98)
- java (27)
- jms (2)
- jta (0)
- 性能调优及内存分析 (4)
- 设计模式 (14)
- 框架 (6)
- 其它 (9)
- job (1)
- maven (1)
- 服务器 (2)
- 分布式 (3)
- ibatis (1)
- linux (0)
- mysql (0)
- 并发编程 (0)
- java多线程 (2)
- 前端跨域 (1)
- 线程dump分析 (0)
- velocity (0)
- 数据库 (2)
- 协议 (0)
- 监控 (0)
- 开源软件 (2)
- 算法 (0)
- 网络 (1)
- spring (1)
- 编码 (0)
- 数据结构 (0)
- HTable和HTablePool使用注意事项 (0)
- opencms (0)
- android (16)
- 操作系统 (2)
- top (0)
最新评论
-
hold_on:
@Override public boolea ...
android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片) -
achersnake:
123
Servlet中listener(监听器)和filter的总结 -
angel243fly:
我用了这个方法,还是报同样的错误,还有什么建议吗?
eclipse提示CreateProcess error=87错误的解决方法
转:http://langyu.iteye.com/blog/410071
很多地方都可以看到动态代理的影子,只是一直没仔细看下。
在学习之前,先提出几个问题,带着问题来看代码:
1.什么是动态代理?
2.为什么使用动态代理?
3.使用它有哪些好处?
4.哪些地方需要动态代理?
--------------------分隔线-----------------------------
和动态代理有关的有两个类
1.interface InvocationHandler
Object invoke(Object proxy, Method method, Object[] args)
只这一个方法,后面再说
2.class Proxy
真正表示动态代理的类,提供两个静态方法:
Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface)
用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”,
用来冒充真实的对象。
Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类),
它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法,
invoke方法就是我们用来做N多事情的地方 -_-。
--------------------分隔线-----------------------------
看完上面的代码,大致明白动态代理的含义:
A接口有c方法,类B实现A接口,原本应该是执行B类中的c方法,可现在不这样做;
我声明产生B类的代理类B',由它来冒充B类的“兄弟”并“实现”A接口,
对外界来说B'应该也有c方法,可当真正调用它的时候,
它会去执行与它关联InvocationHandler的invoke()方法,
在这个方法里面你可以做很多事情。这样,这个请求就被“代理”到其它地方去了。
下面是根据我的理解画的一个说明图
--------------------分隔线-----------------------------
引用网上的一个例子来说明问题(有部分改动,转载自:http://callan.iteye.com/blog/161806)
真实的接口:
它的真实实现类:
在这里生成与代理类相关联的InvocationHandler对象
最后是测试类:
这里是输出结果:
--------------------分隔线-----------------------------
最后试着来回答之前提出的问题:
1.什么是动态代理?
一种用于转发请求,进行特殊处理的机制,“动态”应该指的是“运行期”。
2.为什么使用动态代理?
可以对请求进行任何处理(如事务,日志等,这都是网上说的,我当然可以做任何处理)
3.使用它有哪些好处?
如上
4.哪些地方需要动态代理?
不允许直接访问某些类;对访问要做特殊处理等,我只能想到这些。
--------------------分隔线-----------------------------
其它一些想法:
1.如果想声明产生B类的代理类,那个B类必须要实现接口,如果没有接口,
代理类就不能伪装成B类的“兄弟”,也就没有存在的意思,
其实也可以伪装成B类的“孩子”,对外他们有共同的接口,可以这样做吧?
2.当请求代理类的方法时,这个请求会被转到执行与代理类关联InvocationHandler
的invoke方法。那InvocationHandler到底是什么?对它的理解可以是这样:
它用来处理方法的调用,实现类也有同样的意义;与代理类对象相关联则表示,
它就是负责处理代理类应该有的动作,把所有的方法请求分发到invoke这个方法上。
--------------------分隔线-----------------------------
学习后总结,既可以全面地观察分析,又能加深印象。
如果我的理解有误,别人的指证会对我产生积极影响。
如果我的理解正确,帮助其它人理解是我的荣幸。
初学者,请多多指教。
发表评论
-
公钥,私钥和数字签名这样最好理解
2012-12-04 13:01 0一、公钥加密 假设一下,我找了两个数字,一个是1,一个是2 ... -
btrace学习二--btrace一个简单例子
2012-11-09 16:28 0btrace安装好了,就看一些语法吧。可以到btrace的官方 ... -
Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
2012-10-25 20:27 0【目录】 一、【基础知识——扫盲】 二、【DOM、S ... -
如何在文件末尾写入新数据,适用JavaNIO
2012-07-02 09:29 1729转:http://stoneli88.iteye.com/bl ... -
BTrace使用简介
2012-05-23 16:23 935转:http://rdc.taobao.com/team/ ... -
java初始化顺序
2012-05-14 15:39 0转:http://www.cnblogs.com/miniwi ... -
HTMLDecoder,&#开头的编码换转成中文
2012-05-11 10:06 1152转:http://blog.sina.com.cn/s/blo ... -
类初始化顺序
2012-04-09 17:33 0转:http://www.cnblogs.com/miniwi ... -
Heritrix的eclipse配置启动
2012-04-07 11:46 0转:http://blog.csdn.net/lifesoft ... -
执行Runtime.exec异常: error=12,Cannot allocate memory
2012-03-26 10:03 1288转:http://blog.csdn.net/chifen ... -
使用Memory Analyzer tool(MAT)分析内存泄漏(二) ZZ
2012-03-13 08:41 1217http://www.blogjava.net/rose ... -
使用Memory Analyzer tool(MAT)分析内存泄漏(一)
2012-03-13 08:40 889转: http://www.blogjava.net/ro ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-03-12 12:52 0最近的机器内存又爆满了,除了新增机器内存外,还应该好好revi ... -
Java内存模型
2012-02-23 19:57 0(原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来 ... -
Runnable、Callable、Executor、Future关系解读
2012-02-22 10:02 0在再度温习Java5的并发编程的知识点时发现,首要的就是把Ru ... -
HashCode本质
2012-02-22 09:05 01.hashcode是用来查找的, ... -
Java并发--任务执行.
2012-02-17 19:40 0PS: 发到博客的文章竟然发布不到论坛, 所以将文章从博客 ... -
java并发编程-Executor框架
2012-02-17 19:39 0Executor框架是指java 5中引入的一系列并发库中 ... -
Java 并发核心编程
2012-02-17 16:28 0内容涉及: 1、关于java ... -
future使用
2012-02-17 14:53 0在Java中,如果需要设 ...
相关推荐
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
这篇学习笔记主要关注动态代理部分,虽然没有提供具体的压缩包文件内容,但根据标题和描述,我们可以深入探讨这两个概念。 **反射(Reflection)** 反射是Java语言的一个强大工具,它允许程序在运行时检查类、接口...
Java JDK6学习笔记是针对Java编程语言初学者和进阶者的一份宝贵资源,它涵盖了Java的基础语法,并通过经典且易于理解的实例进行讲解。在本文中,我们将深入探讨Java JDK6中的关键概念和特性,以帮助你更好地理解和...
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...
### Java语言反射与动态代理深度解析 #### 一、Java反射机制详解 Java反射机制是Java编程语言的一个强大特性,允许程序在运行时检查和修改自身结构与行为。这一机制为开发人员提供了高度的灵活性,尤其是在框架...
学习笔记会讲解如何使用反射进行元编程,以及其在插件系统、序列化和动态代理中的应用。 9. **Java API和库**:Java标准库提供了大量的预定义类和接口,如JDBC(Java数据库连接)用于数据库操作,Swing和JavaFX用于...
这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
Java面试题及学习笔记概述 Java作为一种广泛应用的编程语言,其面试题库广泛且深入,涵盖了从基础语法到高级特性的各个层面。本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、...
JDK动态代理是一种在运行时动态创建代理类和代理对象的技术,主要用来实现对目标对象的方法调用进行增强,例如添加日志、事务控制等通用功能,而无需修改目标对象的代码。动态代理可以帮助我们达到更好的解耦合效果...
8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等高级功能至关重要。 9. **JNI(Java Native Interface)**:当JAVA代码需要调用本地(C/C++)代码时,JNI...
【良葛格Java学习笔记】 本笔记主要涵盖了Java编程语言的核心概念和技术,旨在帮助初学者以及有一定基础的开发者深入理解并掌握Java。Java作为一种广泛应用于企业级应用开发、移动开发(尤其是Android)以及大数据...
4. **动态代理增强**:Java动态代理在JDK 6中得到增强,允许开发者创建接口的代理类,动态实现这些接口并在运行时添加方法调用处理。 5. **脚本支持**:JDK 6引入了JSR 223,即脚本引擎接口,支持JavaScript和其他...
这份"个人Java学习过程中所有学习笔记"包含了作者在学习Java时积累的宝贵经验,旨在帮助初学者或有经验的程序员巩固基础,提升技能。 笔记内容可能涵盖以下几个主要部分: 1. **Java基础**:这部分通常包括Java的...
Java学习笔记涵盖了许多核心概念,包括面向对象编程的各个方面。以下是对这些知识点的详细解析: 1. **继承中方法的重写**: 当子类重写父类的方法时,子类方法的访问权限必须至少等于或大于父类中对应方法的访问...
Java JDK 6学习笔记是Java开发者入门和进阶的重要参考资料,由知名作者林信良编著。本笔记主要涵盖了JDK 6版本的核心特性和关键概念,为读者提供了全面而深入的学习路径。以下是对其中重要知识点的详细阐述: 1. **...
【标题】"良葛格Java学习笔记html.rar"是一份以HTML格式编写的Java学习资料,由知名在线教育人物“良葛格”所创建。这份压缩包文件包含了他对Java编程语言深入浅出的讲解,旨在帮助学习者提高Java编程技能。 【描述...
Java公司培训经典学习笔记是针对Java编程语言进行深入学习的一份宝贵资料,涵盖了从基础到高级的诸多知识点,旨在帮助开发者提升技能,适应企业级项目开发的需求。以下将详细阐述这些笔记中的关键点: 1. **Java...
这份学习笔记将深入探讨Java编程语言的基础、核心概念以及J2SE中的关键特性。以下是一些重要的Java-J2SE知识点: 1. **Java语言基础**: - **变量与数据类型**:Java有基本数据类型(如int, double, boolean等)和...