`
scholers
  • 浏览: 614831 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA动态代理解析

阅读更多
众所周知,JDK的动态代理模式必须实现接口。
以下面的源码为例:
接口一:
  
  public interface ActionInterface {
	void doSelf(String str);
	String getType();
}


接口二:
 public interface InterruupIntf {
	void interrup();
}

实现类:

public class MyselfImpl  implements ActionInterface, InterruupIntf {
	
	public String getType() {
		String type = "公用部门";
		System.out.println(type);
		return type;
	}

	public void doSelf(String str) {
		System.out.println("业务实现类: " + str + " !");
	}

	public void interrup() {
		System.out.println("发呆三分钟!");
	}
}


动态代理需要反射,
*  必须要实现InvocationHandler接口
*  能够对所有的方法进行代理
public class MyInvocationHandler implements InvocationHandler {
	private Object obj;

	/**
	 * 通过构造方法来设置被代理的对象
	 * @param obj
	 */
	public MyInvocationHandler(Object obj) {
		this.obj = obj;
	}

	/**
	 * 动态代理需要反射
	 * 
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("+++++++++++调用业务方法之前做其他事情");
		Object returnObject = method.invoke(obj, args);
		System.out.println("+++++++++++调用业务方法之前做其他事情");
		return returnObject;
	}

	/**
	 * 测试函数
	 * 动态代理对所有的代理类都进行了拦截
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws SecurityException
	 * @throws IllegalArgumentException
	 */
	public static void main(String[] args) throws InterruptedException,
			IllegalArgumentException, SecurityException,
			InstantiationException, IllegalAccessException,
			InvocationTargetException, NoSuchMethodException {
		//实现业务逻辑的类
		MyselfImpl muSelf = new MyselfImpl();
		//JDK创建的动态逻辑类,调用上面的构造函数注入
		MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);
		/*
		Class<?> proxyClass = Proxy.getProxyClass(
				MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces());
			
		
		//建业务逻辑类的动态代理类
		Object proxy = proxyClass.getConstructor(
				new Class[] { InvocationHandler.class }).newInstance(
				new MyInvocationHandler(new MyselfImpl()));	*/
		//建业务逻辑类的动态代理类
		Object proxy = Proxy.newProxyInstance(MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces(), myInvocation);
		
		//业务类自己调用运行代理对象
		ActionInterface testIntf = (ActionInterface) proxy;
		testIntf.doSelf("我要做业务了!");
		testIntf.getType();
		
		
		InterruupIntf intIntf = (InterruupIntf) proxy;
		intIntf.interrup();
	}
}

运行最后一个类的MAIN函数,控制台输出结果如下:

+++++++++++调用业务方法之前做其他事情
业务实现类: 我要做业务了! !
+++++++++++调用业务方法之前做其他事情
+++++++++++调用业务方法之前做其他事情
公用部门
+++++++++++调用业务方法之前做其他事情
+++++++++++调用业务方法之前做其他事情
发呆三分钟!
+++++++++++调用业务方法之前做其他事情

看到结果了。
JDK的动态代理,对MyselfImpl所有方法都进行了拦截,在调用真正的业务类方法之前之后都插入了代码,这就是JDK的动态代理。其实SPRING的AOP思想的基本原理也是这个,但是它写的复杂多了,而且比较优秀。



1
3
分享到:
评论

相关推荐

    java动态代理解析

    本片文档剖析了java动态代理的原理。具体请看文档

    java动态代理详细解析

    在学习之前,先提出几个问题,带着问题来看代码: 1.什么是动态代理? 2.为什么使用动态代理? 3.使用它有哪些好处? 4.哪些地方需要动态代理?

    关于jdk动态代理的源码剖析

    对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。

    Java简单实现动态代理模式过程解析

    主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    lotus domino java代理_获取传递值json

    lotus domino java代理_获取传递值json

    Java JDK动态代理实现原理实例解析

    主要介绍了Java JDK动态代理实现原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    动态代理.xmind

    该思维导图主要讲解了代理模式的具体实现,包括jdk代理,cglib代理。其中jdk代理主要讲解了其具体的实现方式、原理...Cglib代理主要讲解了其原理、与JDK代理的对比、Enhancer源码解析、methodProxy和Fastclass源码等。

    编写简单的代理服务器(java源码)

    代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    javajdk源码解析-Code-Adventure:Java基础、JDK源码解析、程序人生

    静态代理与动态代理 | 初始进洞(上) 静态代理与动态代理 | 初识进洞(中) JDK源码 JDK探秘 | 详解Integer的享元缓存机制 JDK探险 | 详解Integer的缓存机制 JDK探秘 | ArrayList的扩容机制 JDK探秘 | String究竟在说...

    java阻塞模型tns协议代理

    用java阻塞模型开发的oracle tns协议代理,只对tns的最外层协议做了解包处理。对各种子协议,未做处理。仅供参考。再此基础上,如果知道具体的协议,则很容易开发出其他代理。

    Java连接数据库步骤解析(Oracle、MySQL)

    本文主要介绍了Java连接Oracle数据库和MySQL数据库的步骤解析。具有很好的参考价值,需要的朋友一起来看下吧

    代理服务器自动测试工具(含Java源码)

    用Java写的一个小工具,通过HTML解析技术,从http://www.cnproxy.com读取代理服务器列表,并采用多线程通过代理服务器连接指定网站,测试该服务器是否可用,将可以使用的代理服务器列出以供使用。这个小工具使用了...

    C# To JAVA Converter v17.10.6

    将C#代理和lambdas转换为Java接口和lambdas 使用Java泛型转换C#ref参数 当代码中定义事件委托时转换C#事件,或者是System.Action或System.Func代理之一 将所有类型的数组从C#转换成Java 对于继承和接口的所有...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包9

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包101

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics