在看AOP(Aspect Oriented Programming)的时候,看到有人说利用Java的动态代理可以轻松实现,于是准备对这个动态代理一探究竟...
首先google了一把,发现关于动态代理的material的确很多,先找了两篇中文的看了一下,大概明白了怎么回事,感觉很简单的一点东西,虽然有些细节还不是太清楚,溯本归源,到sun公司网站去看,然后通过自己动手做了个sample,终于搞清楚了它的来龙去脉,在这里与大家分享一下,如有不正之处,敬请指正...
首先简单回顾一下代理模式的内容,“动态”毕竟只是个修饰词:)...
定义(GoF):为其他对象提供一种代理以控制对这个对象的访问,那么简单分析一下这个定义的含义:
1、区分代理对象和被代理对象,客户直接跟代理对象交互,即代理对象向用户隐藏了被代理对象
2、代理对象并不代替被代理对象的工作,真正的工作还是由被代理对象做,但可以通过代理对象增加一些额外的功能(对用户而言)
有了上面的基础,让我们看一下Java中的动态代理又是怎么一回事...
首先,这个动态的含义,我觉着很多文章上并没有明确指出,很多文章只是给出了个例子,但并没有解释清楚,我在这里给大家深入介绍一下,希望是对其他文章的一个补充...
其实,这里动态的含义,是指动态生成代理类,注意是生成类,而不是对象,这利用到了动态代码生成,而且这个动态生成的代理类宣称实现了被代理类的所有接口,那么这是如何做的呢?这是因为我们在调用Proxy.newInstance(...)的时候,第二个参数就将被代理类的接口传给了该函数用于动态生成代理类,当然上面这个函数最终返回的是一个代理类的实例,但我们需要知道这个函数内部实际上是先调用Proxy.getProxyClass()生成代理类,然后才由该代理类生成代理对象的。
Ok,我们清楚了代理类及其实例的生成过程,那么我们下面看看代理类是如何调用被代理类中的对应方法的呢?其实,
动态生成的代理类并没有直接调用被代理类的对应方法,而是调用了在生成代理类时穿过去的一个InvocationHanlder接口的一个实现。也就是说在动态生成的代理类中,它将方法调用全部委托给了InvocationHanlder,它调用了InvocationHanlder的invoke函数,而在invoke函数中,InvocationHanlder又通过反射调用了被代理类的对应函数,这样一个好处是我们可以自己定制代理类如何调用被代理类的方法,比如我们可以在调用被代理类的方法之前和之后加入log功能等。
但注意,Java的动态代理只针对接口。写到这不知道讲清楚了没有,下面看个例子吧,可能就更容易理解了...
/*
* @(#)HelloWorld.java 1.82 99/03/18
*
* Copyright (c) 2006-2008 ics@nju.edu.cn
* Nanjing University
* All rights reserved.
*
* This software can be used freely, however, a comment about where it
* is from is necessary when you use it in your code.
*/
package example.dynamicproxy;
/**
* @name HelloWorld.
*
* @version 1.00 18 Mar 1999
* @author Lin Qiang
*/
public interface HelloWorld {
void sayHello(String what);
}
///////////////////////////////////////////////////////////////////////////////////
/*
* @(#)HelloWorldImpl.java 1.82 99/03/18
*
* Copyright (c) 2006-2008 ics@nju.edu.cn
* Nanjing University
* All rights reserved.
*
* This software can be used freely, however, a comment about where it
* is from is necessary when you use it in your code.
*/
package example.dynamicproxy;
/**
* @name HelloWorldImpt.
*
* @version 1.00 18 Mar 1999
* @author Lin Qiang
*/
public class HelloWorldImpl implements HelloWorld {
public void sayHello(String what) {
System.out.println(what);
}
}
///////////////////////////////////////////////////////////////////////////
/*
* @(#)HelloProxy.java 1.82 99/03/18
*
* Copyright (c) 2006-2008 ics@nju.edu.cn
* Nanjing University
* All rights reserved.
*
* This software can be used freely, however, a comment about where it
* is from is necessary when you use it in your code.
*/
package example.dynamicproxy.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import example.dynamicproxy.HelloWorld;
import example.dynamicproxy.HelloWorldImpl;
import example.dynamicproxy.UseProxy;
/**
* @name HelloProxy.
*
* @version 1.00 18 Mar 1999
* @author Lin Qiang
*/
public class HelloProxy implements InvocationHandler {
private Object obj;
public HelloProxy(Object obj2) {
this.obj = obj2;
}
public static Object newInstance(Object obj2)
{
return Proxy.newProxyInstance(obj2.getClass().getClassLoader(),
obj2.getClass().getInterfaces(),
new HelloProxy(obj2));
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
Object result = null;
System.out.println("Entering function: " + arg1.getName() + "...");
result = arg1.invoke(obj, arg2);
System.out.println("Leaving function: " + arg1.getName() + "...");
return null;
}
public static void main(String[] args)
{
HelloWorld he = (HelloWorld)HelloProxy.newInstance(new HelloWorldImpl());
he.sayHello("hello,moto");
}
}
<End>
分享到:
相关推荐
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
而Cglib则不需要目标对象实现接口,通过继承目标类实现代理,因此适用于没有接口或不希望修改原有代码的情况。不过,Cglib生成代理类的速度比JDK慢,且内存占用稍高。 总结来说,Java动态代理为开发者提供了灵活的...
在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...
本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...
Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...
Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...
动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有接口的扩展与增强。 在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
在这个实例中,我们将深入探讨Java动态代理的核心概念,以及如何利用它来实现拦截器模式。 首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....
Java实现简单动态代理连接池
Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...