- 浏览: 196600 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sucheng2016:
SYBASE的字段类型 -
sushi1025:
MySQL删除重复数据行,只保留一条 -
793059909:
看不懂,能否简单解释下。更常见的做法是把需要保留的数据放一张临 ...
MySQL删除重复数据行,只保留一条 -
zyllezi:
困扰了好久,终于解决了,多谢博主
使用PHP访问MySQL,Apache httpd.exe报错
参考:Spring开发指南(作者:夏昕)
-------------------------------------------------------------------------------------------------------------------------------
在Spring开发指南(作者:夏昕)的论述中提到了Java的动态代理,按照作者的说法,Dynamic Proxy是JDK 1.3版本中新引入的一种动态代理机制。它是Proxy模式的一种动态实现版本。
下面,用代码来说明一下Java动态代理。
首先,被代理的类必须是实现某个接口的。我们现在定义接口——计算器接口:
package test.quqtalk.dynamicproxy; /** * 计算器接口 * @author Administrator * */ public interface CalculatorInterface { public int add(int arg1, int arg2); }
然后,是接口的实现——计算器:
package test.quqtalk.dynamicproxy; /** * 计算器实现 * @author Administrator * */ public class CalculatorImpl implements CalculatorInterface { /** * 返回两个整数的和 */ public int add(int arg1, int arg2) { return arg1 + arg2; } }
最后,是代理的实现。这里需要实现InvocationHandler接口,假设我们这个代理的作用是在调用add函数前后记录时间点。我们叫LogHandler。
package test.quqtalk.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 计算器代理 * * @author Administrator * */ public class LogHandler implements InvocationHandler { Log log = LogFactory.getLog(LogHandler.class); SimpleDateFormat sdf= new SimpleDateFormat("yyyy-dd-MM hh:mm:ss"); Object obj_orgin; /** * 传入被代理对象,返回代理对象 * * @param obj,被代理对象 * @return 代理对象 */ public Object bind(Object obj) { this.obj_orgin = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("add")) { int ret = 0; // 在invoke前记录日志 log.info("before add time is " + sdf.format(new Date())); ret = (Integer) method.invoke(obj_orgin, args); // 在invoke后记录日志 log.info("after add time is " + sdf.format(new Date())); return ret; } else { return method.invoke(obj_orgin, args); } } }
测试main函数:
public static void main(String[] args) {
CalculatorInterface c = (CalculatorInterface) new LogHandler()
.bind(new CalculatorImpl());
System.out.println("result is " + c.add(1, 1));
}
控制台输出结果:
16:59:38,531 INFO [main] test.quqtalk.dynamicproxy.LogHandler (LogHandler.java:41) - before add time is 2009-13-05 04:59:38
16:59:38,531 INFO [main] test.quqtalk.dynamicproxy.LogHandler (LogHandler.java:44) - after add time is 2009-13-05 04:59:38
result is 2
当然,这个例子是非常简单的,在项目中这样做基本没有什么实用价值。然而通过这个例子,基本可以明白动态代理的机制和好处。
如果有很多个函数都需要在调用前和调用后记录时间点,那么只需要将这些对象传入LogHandler的bind函数,用得到的代理调用相应函数即可。当然,这里不只可以记录日志,我们可以做任意我们想做的事情。我想这就是动态代理的好处。
发表评论
-
Double Checked Locking双重检查锁
2017-03-07 13:16 661要使Double Checked Locking双重检查锁模 ... -
Singleton的线程安全
2017-03-07 12:59 713网上可以找到很多种Si ... -
通过JMX取本地JVM内存使用信息
2016-05-18 06:35 1533import java.io.BufferedWriter; ... -
9个主流的开源许可协议[整理]
2013-05-10 07:27 1152转自:http://univasity.iteye.co ... -
自定义ANT Listener
2011-08-13 10:48 915package com.doit.util; im ... -
JVM Memory Structure
2010-11-30 09:36 1276JVM Memory Structure As expe ... -
java的volatile是什么意思
2010-09-02 16:08 969转自:http://qingfeng825.iteye ... -
读写锁的使用
2010-09-02 12:05 1516转自:http://www.blogjava. ... -
java多线程(创建线程的两种方式)
2010-08-31 17:39 1532转自:http://hi.baidu.com/moonha ... -
关于Jconsole
2010-02-02 15:58 888使用Jconsole命令监控Java进程,如果想使用远程监控, ... -
Oracle启动停止命令
2009-10-27 16:26 8481、启动数据库: oracle@suse92:~> ... -
启动ORACLE
2009-10-21 09:25 670sqlplus /nolog; connect sys/s ... -
ORACLE创建用户
2009-09-14 09:32 1083CREATE TABLESPACE qsh_DAT ... -
Spring AOP——轻松实现代理
2009-05-15 11:16 1652本文依然参考夏昕的Spring开发指南(下载自满江红)。 ... -
详细解析抽象类和接口的区别
2009-05-12 09:36 9132009-05-12 09:34:23 来 ... -
ibatis SQL Map demo
2009-05-10 17:51 2757在spring的jpestore中,数 ... -
使用JDOM创建XML文档的DTD
2009-05-08 15:09 2250首先,创建public的DTD。不知道public形式的DTD ... -
查看sybase版本信息
2009-05-08 14:12 2644select @@version -
Sybase存储过程报transaction mode错误
2009-05-05 11:42 5206报错信息: 11:17:53,375 ERROR [A ... -
JBoss使用Sybase报(JZ006: 捕获到 IO 例外)JZ0C0: 连接已关闭。
2009-03-31 16:09 11301JBoss在default/deploy下使用sybase ...
相关推荐
对代理模式与Java动态代理类的理解说明
本示例将带你深入理解Java动态代理的概念,并通过一个简单易懂的demo来演示其用法。 1. **Java动态代理概念** Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写...
Java动态代理是Java编程中一个重要...以上内容是对Java动态代理技术的概述,详细的学习和理解可以通过阅读给定的文档来深入探讨。在实践中,掌握动态代理能够帮助开发者编写更灵活、可扩展的代码,提高软件的可维护性。
本教程将通过三个Demo来深入理解Java动态代理的原理和应用。 **一、代理原理** 代理模式是一种设计模式,它提供了一种在不修改原对象的情况下,对原对象功能进行扩展的方法。在Java中,静态代理和动态代理是两种...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
"示例来理解Java动态代理: ```java // 目标接口 public interface HelloWorld { void sayHello(); } // 目标实现 public class HelloWorldImpl implements HelloWorld { @Override public void sayHello() { ...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...
本文将深入讲解如何利用Java动态代理技术来实现AOP,以便于读者理解并实践。 #### 二、面向切面编程(AOP)简介 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在通过将横切关注点与...
新的 UserService 实例 = new UserServiceImpl(); UserService proxyUserService = new UserServiceProxy(userServiceImpl);...了解和掌握动态代理技术对于深入理解 Java 并应用于实际项目开发有着重要的意义。
Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...
Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...
Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现指定的接口。这一机制使得我们可以在不修改已有代码的情况下,为已有接口增加额外的功能或者增强已有功能的行为。在Java中,动态...
下面通过一个简单的例子来理解Java动态代理的工作原理: ```java // 定义接口 public interface HelloWorld { void sayHelloWorld(); } // 实现接口 public class HelloWorldImpl implements HelloWorld { ...
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码的情况下,扩展或增强原有类的功能。这里我们将深入探讨两个主要的Java动态代理...