`
scholers
  • 浏览: 620274 次
  • 性别: 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动态代理机制

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

    java动态代理新java动态代理新java动态代理新

    根据给定的信息,本文将重点解析Java动态代理技术,并适当关联Tomcat的配置与管理,因为给定部分内容涉及到了Tomcat的应用与管理。 ### Java动态代理技术解析 #### 一、Java动态代理简介 Java动态代理是Java反射...

    Java中的动态代理

    ### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...

    java 简答可复用动态代理类

    Java动态代理是一种强大的技术,它允许我们在运行时创建对象,这些对象可以作为其他对象的代理,从而在调用实际方法之前或之后执行额外的操作。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    基于Java动态代理和反射机制实现ORM

    在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...

    java动态代理

    接下来,我们将通过给定的代码示例来详细解析Java动态代理的具体实现。 ##### 1. 接口定义 首先,我们定义了一个接口`MyInterface`,该接口包含两个方法:`print()`和`test(int num)`。 ```java public interface...

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

    在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入分析JDK动态代理的工作原理及其内部实现机制。 ###...

    Java动态代理机制详解[整理].pdf

    Java动态代理机制是一种在运行时创建代理类和代理对象的技术,它允许我们在不修改源代码的情况下,对已有的接口或类进行扩展,增加新的功能。动态代理主要应用于事件监听、事务处理、性能监控等场景,提供了更加灵活...

    Java反射与动态代理

    Java反射是Java编程语言中的一个强大特性,...但需要注意的是,过度使用反射和动态代理可能会带来性能损失,因为它们都需要在运行时解析类信息,增加了额外的开销。因此,在实际开发中应适度使用,以平衡功能性和性能。

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    JAVA类加载机制与动态代理

    ### JAVA类加载机制与动态代理 #### 一、类加载机制 ##### 1.1 类加载的时机 类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的...

    Java Spring 源码解析 Xmind 思维导图

    在Spring源码解析中,时序图用于描绘不同组件之间的调用关系,如AOP代理的生成过程、事件发布机制、数据访问层(DAO)与业务逻辑层(Service)的交互等。这有助于开发者理解Spring如何处理复杂的应用场景。 再者,...

    经典java反射和动态代理代码

    Java反射和动态代理是Java编程中的重要特性,它们允许程序在运行时检查和操作类、接口、对象等的内部结构,以及动态地创建代理对象来处理特定任务。在这篇文章中,我们将深入探讨这两个主题,结合"reflections"这个...

    J2SE动态代理解析

    Java平台标准版(J2SE)中的动态代理技术是自JDK 1.3版本引入的一个强大特性,它使得开发者可以在程序运行时动态地创建符合特定接口的代理对象。动态代理在实际应用中广泛用于实现面向切面编程(AOP),如日志记录、...

    Java静态代理和动态代理

    ### Java静态代理与动态代理深度解析 #### 一、代理模式概述 代理模式是一种常见的设计模式,主要用于在访问目标对象之前或之后增加额外的操作。它通过代理类与委托类(真实对象)之间的交互,实现对目标对象功能...

    Java采集最新动态代理IP

    总的来说,Java爬虫结合Jsoup实现动态IP代理是一个涉及网络通信、HTML解析、数据处理和代理机制等多个方面的综合性问题。理解并掌握这些知识点,不仅可以提升爬虫的实用性,还有助于提高对Web技术和网络编程的理解。

Global site tag (gtag.js) - Google Analytics