`

Java动态代理我之理解

阅读更多

参考: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函数,用得到的代理调用相应函数即可。当然,这里不只可以记录日志,我们可以做任意我们想做的事情。我想这就是动态代理的好处。

 

 

 

 

 

 

分享到:
评论

相关推荐

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

    java动态代理demo

    本示例将带你深入理解Java动态代理的概念,并通过一个简单易懂的demo来演示其用法。 1. **Java动态代理概念** Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写...

    java动态代理 经典文章(word 2007格式的)

    Java动态代理是Java编程中一个重要...以上内容是对Java动态代理技术的概述,详细的学习和理解可以通过阅读给定的文档来深入探讨。在实践中,掌握动态代理能够帮助开发者编写更灵活、可扩展的代码,提高软件的可维护性。

    java动态代理源代码

    本教程将通过三个Demo来深入理解Java动态代理的原理和应用。 **一、代理原理** 代理模式是一种设计模式,它提供了一种在不修改原对象的情况下,对原对象功能进行扩展的方法。在Java中,静态代理和动态代理是两种...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    Java动态代理helloworld

    "示例来理解Java动态代理: ```java // 目标接口 public interface HelloWorld { void sayHello(); } // 目标实现 public class HelloWorldImpl implements HelloWorld { @Override public void sayHello() { ...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    java 动态代理实现AOP

    本文将深入讲解如何利用Java动态代理技术来实现AOP,以便于读者理解并实践。 #### 二、面向切面编程(AOP)简介 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在通过将横切关注点与...

    Java 动态代理详解(学习资料)

    新的 UserService 实例 = new UserServiceImpl(); UserService proxyUserService = new UserServiceProxy(userServiceImpl);...了解和掌握动态代理技术对于深入理解 Java 并应用于实际项目开发有着重要的意义。

    Java动态代理案例演示代码

    Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    一个简单的java动态代理的实例

    Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...

    java动态代理(2)

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现指定的接口。这一机制使得我们可以在不修改已有代码的情况下,为已有接口增加额外的功能或者增强已有功能的行为。在Java中,动态...

    Java中的动态代理

    下面通过一个简单的例子来理解Java动态代理的工作原理: ```java // 定义接口 public interface HelloWorld { void sayHelloWorld(); } // 实现接口 public class HelloWorldImpl implements HelloWorld { ...

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    java动态代理例子

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码的情况下,扩展或增强原有类的功能。这里我们将深入探讨两个主要的Java动态代理...

Global site tag (gtag.js) - Google Analytics