- 浏览: 461538 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
1. 首先定义一个接口.
2. 再定义一个接口的实现类
我们使用面向接口编程,最简单的调用方式是[1]
然而使用这种调用方式使得接口和实现通过硬编码的方式耦合在了一起.
JDK动态代理可以生成一个代理对象.
3. 创建JDK动态代理Handler[2]
4. 创建调用接口.
看到这里我发现了,当我们调用Spring中的getBean(),他会返回一个初始化好的实例给你.
IOC很简单的把程序的耦合[1],移到了配置文件ApplicationContext.xml当中;当我们调用Spring中的AOP时,他会返回一个初始化好的实例给你,但是这个实例是一个JKDProxy,这样就可以在invoke中添加一些自定义的行为[2].
总结:约定优于配置,我们完全可以跳过JDK的动态代理来实现完全基于IOC的“伪”动态代理,规则如下:
存储路径规则:
proxy:存储接口
proxy.impl:存储接口的实现类
类名定义规则:
ITarget:接口类名
Target:接口实现类名
注意:接口的类名必须以"I"开头,后面符合Java命名规范,实现类必须为接口名称去掉"I".
5. "伪"动态代理
6. 对伪代理的调用
这样可以替代JDK动态代理,而且其实现效率更高,不需要Spring配置,只需要通过这个"伪"代理就可以实现从接口到实现的转换,其出错的概率也更低.
当然我这里给出的只是一个简单的范例,代码也是草草,不能和Spring这强大的框架相比,但是其效率绝对是最高的.
这里还有很多需要完善的,比如说代理对象有复杂的对象作为其输入参数,还有日志及其异常处理等等.
package proxy; /** * 操作接口 * version 1.0 Jul 15, 2010 */ public interface ITarget { /** * 操作方法 */ public void operator(); }
2. 再定义一个接口的实现类
package proxy.impl; import proxy.ITarget; public class Target implements ITarget { @Override public void operator() { // TODO Auto-generated method stub System.out.println(">>>正在调用Targer.operator()方法!"); } }
我们使用面向接口编程,最简单的调用方式是[1]
ITarget it=new Target(); it.operator();
然而使用这种调用方式使得接口和实现通过硬编码的方式耦合在了一起.
JDK动态代理可以生成一个代理对象.
3. 创建JDK动态代理Handler[2]
package proxy.handler; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MethodHandler implements InvocationHandler { private Object targetObject; public Object newProxy(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub Object ret = null; try { ret = method.invoke(this.targetObject, args); } catch (Exception e) { e.printStackTrace(); throw new java.lang.RuntimeException(e); } return ret; } }
4. 创建调用接口.
MethodHandler handler=new MethodHandler(); ITarget ii=(ITarget)handler.newProxy(new Target()); ii.operator();
看到这里我发现了,当我们调用Spring中的getBean(),他会返回一个初始化好的实例给你.
IOC很简单的把程序的耦合[1],移到了配置文件ApplicationContext.xml当中;当我们调用Spring中的AOP时,他会返回一个初始化好的实例给你,但是这个实例是一个JKDProxy,这样就可以在invoke中添加一些自定义的行为[2].
总结:约定优于配置,我们完全可以跳过JDK的动态代理来实现完全基于IOC的“伪”动态代理,规则如下:
存储路径规则:
proxy:存储接口
proxy.impl:存储接口的实现类
类名定义规则:
ITarget:接口类名
Target:接口实现类名
注意:接口的类名必须以"I"开头,后面符合Java命名规范,实现类必须为接口名称去掉"I".
5. "伪"动态代理
package proxy.handler; public class ChgHandler { public Object invoke(Class interfaceName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ String path=interfaceName.getName(); int point=path.lastIndexOf("."); String pack=path.substring(0,point); String clsname=path.substring(point+1); String proxyimpl=pack.concat(".impl"); String proxynameimpl=clsname.replaceFirst("I", ""); String proxyName=proxyimpl.concat(".").concat(proxynameimpl); Class<?> proxyclass=Class.forName(proxyName); return proxyclass.newInstance(); } }
6. 对伪代理的调用
ChgHandler chgh=new ChgHandler(); ITarget hh=(ITarget) chgh.invoke(ITarget.class); hh.operator();
这样可以替代JDK动态代理,而且其实现效率更高,不需要Spring配置,只需要通过这个"伪"代理就可以实现从接口到实现的转换,其出错的概率也更低.
当然我这里给出的只是一个简单的范例,代码也是草草,不能和Spring这强大的框架相比,但是其效率绝对是最高的.
这里还有很多需要完善的,比如说代理对象有复杂的对象作为其输入参数,还有日志及其异常处理等等.
发表评论
-
Java Application Cache
2016-09-27 19:25 825Application Cache is used very ... -
Java 字符串分词
2015-01-02 14:43 1674在Java的世界里有个类型 ... -
jdk 1.6 新特性,集成Groovy, 性能很差
2014-04-02 14:27 1217性能都是相对的,如果调用量不是很大的话,可以忽略,毕竟使用为主 ... -
Fake Code easy implements
2014-04-01 15:41 988package org.miniframe.modules ... -
JDK regex 用法及用途
2014-03-31 15:48 1160查找 Boolean flag = pattern.mat ... -
生产者消费者(四)
2014-03-04 12:32 1097需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(三)
2014-03-04 10:59 914需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(二)
2014-03-03 15:40 634需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者模式(一)
2014-02-28 14:30 989需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
查看Class文件使用的JDK版本
2013-10-30 14:17 1064由于JDK一般是向下兼容的,所以有时候本地的JDK版本比类库的 ... -
Java源代码转码
2012-12-20 17:22 1278现在中国的项目很多,编码无非是UTF-8,GBK,GB2312 ... -
Tomcat集成OSGI,并通过JNDI开放Web调用
2012-12-03 11:22 3076Tomcat集成OSGi,首先要选择OSGI服务器,我这里采用 ... -
JDK的Logging
2012-11-07 15:49 1644jdk自带有一个log日志,对于一般的使用,仅够了. 代码如下 ... -
java.util.*
2012-11-06 14:23 1324java.util 工具包,灰常的有用,有机会一定要研读源码。 ... -
java.util.concurrent.*
2012-11-02 10:38 17281. java.util.concurrent.ArrayBl ... -
java.util.rt.*
2012-10-31 13:51 10661. java.util.HashMap 散列表,主要是以离散 ... -
巧秒设计方法,不返回null
2016-09-27 19:32 644/** * {@inheritDoc} * ... -
java doc 代码文档
2012-07-13 13:58 1270对于代码规范不解释了,网上很多。 在编写代码的时候,有一点灰 ... -
接口与抽象类
2012-07-11 16:53 10821. 接口设计必谨慎,除非业务变更,否则打死不能动接口。[不变 ... -
JVM优化机制好诡异
2012-04-20 08:43 1419long i[] = new long[1000000]; ...
相关推荐
通过一个简单例子来理解JDK动态代理的思想,资源为拷贝的视频讲解的内容。
JDK动态代理,关于jdk动态代理的问题!详细的说明!JDK动态代理JDK动态代理
jdk 的动态代理和CGLIB代理
Jdk1.8新特性代码示例
JDK代理和Cglib代理,下载源码清楚了解二者区别
Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy
jdk21集成cxf示例程序
spring aop jdk 动态代理的底层实现解析模拟
java代理机制 JDK动态代理和cglib代理 详解
其中代码示例 jdk8的特性使用pdf 其中JDK1.8 API 中文文档以及新特性pdf 讲解 带代码示例 JDK1.8 API 中文文档以及新特性pdf 讲解 带代码示例
最近想看一下jdk1.8的新特性,下载了最新版的jdk1.8并觉得里面的demo还不错,分享一下。这是64位的。
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
java jdk 动态代理演示demo
JDK动态代理源码下载,动态产生代理,实现对【不同类】,【不同方法】的代理
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
JAVA设计模式在JDK中的应用JAVA设计模式在JDK中的应用 各种设计模式在JDK当中使用的地方 方便分析源码
JDK动态代理proxy的基本工作原理代码!!
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理