`
xianzhideng
  • 浏览: 61680 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java 动态代理AOP的实践

    博客分类:
  • J2SE
阅读更多

用了这久的Spring,一直对它的AOP,IOC的原理感到十分好奇(特别是拦截器的实现),于是看了下动态代理,并小小实践了一把,特将实践的个人心得记录于此,方便以后的回顾,呵呵。

java 的动态代理要用到两个jdk1.3的基础类。分别为:

1.java.lang.reflect.Proxy:Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。要获取被代理的后的实例对象,就要通过此类。

2.java.lang.reflect.InvocationHandler:代理实例的 调用处理程序 实现的接口。代理实例通过实现此接口的 invoke方法,实现的代理逻辑(我称为拦截的操作)。例如日志记录,信息发送,安全和事务支持等。

 

下面为写的测试的代码:

首先是创建一个接口:ActI.java。这里说下java的动态代理是面向接口编程的,所以被代理类都必须实现一个接口作为被代理后的实例类型。

public interface ActI {
	public void sayHello(String name);
	public void sayBye(String name);
}

 

接着是实现此接口的业务逻辑类:MyAct .java

public class MyAct implements ActI {

	public void sayHello(String name) {
		// TODO Auto-generated method stub
		System.out.println("hello " + name);
	}

	public void sayBye(String name) {
		// TODO Auto-generated method stub
		System.out.println("bye "+name);
	}
}

   最后创建一个代理的类,继承于InvocationHandler类:Proxyhandle.java(在invok方法中实现拦截的拦截的逻辑)

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.ActI;

/**
 * 创建一个代理的工厂,继承InvocationHandler类
 * @author dxz
 */
public class Proxyhandle implements InvocationHandler {
	private Object obj;
	//在这里指定被代理的类,并生成代理后的类
	public Object getProxy(String className) {
		try {
			obj = Class.forName(className).newInstance();
			return  Proxy.newProxyInstance(
					obj.getClass().getClassLoader(),
					obj.getClass().getInterfaces(),
					this);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * proxy - 在其上调用方法的代理实例
	 * method - 对应于在代理实例上调用的接口方法的 Method 实例。
	 * args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		 Object result = null;
		
        try {
            System.out.println("你执行的方法为:"+method.getName());
            //調用Object的方法
            result = method.invoke(obj, args);
            System.out.println("实例方法执行结束!");
        } catch (Exception e) {
			e.printStackTrace();
		}
        return result;
	}
	
}

  接下来就写个main函数测试吧,哈哈。

 

public static void main(String[] args) {
		Proxyhandle proxyhandle = new Proxyhandle();
		ActI actI = (ActI) proxyhandle.getProxy("com.MyAct");
		actI.sayBye("jack");
		actI.sayHello("jack");
	}

  结果为:

你执行的方法为:sayHello
hello jack
实例方法执行结束!
你执行的方法为:sayBye
bye jack
实例方法执行结束!

 

  这样就实现了在执行实际逻辑之前和之后做些拦截的操作了。

分享到:
评论

相关推荐

    java 动态代理实现AOP

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

    用Java动态代理实现AOP

    Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....

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

    - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...

    Java JDK 实现AOP

    在Java环境中实现AOP时,可以使用Java的动态代理机制。以下是一个简单的示例,展示了如何使用Java反射API实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import...

    Java实现aop案例

    Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的代码,如日志、事务管理、权限检查等...文件列表中的"java实现aop案例"可能是示例代码或相关资源,供读者下载和实践。

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

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

    动态代理(AOP)简单例子

    动态代理(Aspect-Oriented Programming,AOP)是面向切面编程的一种编程范式,它主要用来解决传统面向对象编程中难以处理的横切关注...这个例子对于初学者来说是一个很好的实践,有助于深入理解AOP和动态代理的概念。

    详解使用Java原生代理实现AOP实例共4页.pdf.zi

    Java原生代理(Java Native Interface...虽然Java原生代理在功能上比专门的AOP框架如Spring AOP有限,但它对于理解AOP原理和实践是一个很好的起点。在实际开发中,根据项目需求和性能考虑,可以选择合适的方式实现AOP。

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    代理设计模式是软件开发中的一种重要模式,它允许我们在不修改原有对象的基础上,通过代理对象对原对象进行增强或控制。本资源主要涵盖了静态...通过学习和实践,你可以更好地掌握代理设计模式以及Spring AOP的使用。

    aop思想的java代码实现

    总之,AOP是提高代码复用和模块化的重要工具,Java中的静态和动态代理提供了实现AOP的途径。通过研究这个项目中的代码,开发者可以深化对AOP原理和实践的理解,并将其应用于实际项目中,提升代码质量和可维护性。

    设计模式之动态代理与spring的aop编程

    在软件设计领域,模式是一种解决...总之,动态代理和Spring AOP是Java开发中强大的工具,它们能帮助我们构建更灵活、可扩展的系统。通过学习和实践,我们可以更好地理解和利用这两个概念,提升代码质量,降低维护成本。

    Aop.rar_aop_java aop 例 proxy

    总结一下,这个资源为你提供了一个深入理解Java AOP的实践平台,涵盖了CGLIB、Javassist和Java动态代理三种常见的实现方式。通过研究并运行这些示例,你将能够更好地理解和运用面向切面编程这一强大的设计模式,提升...

    Java动态代理学习测试类

    这个“Java动态代理学习测试类”可以帮助我们理解和实践Java动态代理的原理和使用,进一步提升我们对Java语言特性的掌握。通过实际编写和运行代码,我们可以更直观地看到动态代理如何工作,从而更好地应用到实际项目...

    JavaEE spring自动实现AOP代理

    在Day01_AutoAOP的学习资料中,你可能将深入理解Spring AOP的原理,实践自动代理的配置,并通过示例代码体验如何使用AOP进行日志记录、事务管理和权限控制等功能。这将有助于提升你在JavaEE开发中的能力,使你的代码...

    JAVA 中Spring aop 实现日志记载

    - **配置Spring AOP**:首先,我们需要在Spring配置文件中启用AOP代理。通常,对于基于注解的配置,会使用`<aop:aspectj-autoproxy>`标签;对于XML配置,可以使用`<aop:config>`和`<aop:pointcut>`定义切点。 ```...

    aop.zip_884AOP_java aop原理_javaaop原理

    Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务...因此,深入学习和实践Java AOP是提升Java开发能力的重要一步。

    基于Bytebuddy的Java Agent AOP框架.zip

    ByteBuddy是Java的一个库,用于在运行时创建和修改Java类和接口,它是创建Java代理或者实现AOP(面向切面编程)框架的理想工具。在本项目"基于Bytebuddy的Java Agent AOP框架.zip"中,我们将探讨如何使用ByteBuddy...

    java aop、ioc 、注解 实例 Demo

    Java AOP通常使用代理模式实现,Spring框架提供了两种主要的代理方式:JDK动态代理和CGLIB代理。JDK代理适用于接口实现类,而CGLIB代理则针对没有实现接口的类。 IOC,即控制反转,是对象依赖关系的反转。在传统的...

    Java动态代理示例代码.rar

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,实现在调用原有...通过学习和实践动态代理,你可以更好地理解和应用AOP编程模式,提升你的Java编程技能。

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活...在提供的压缩包文件"JavaReflect"中,可能包含了关于Java反射和动态代理的示例代码和教程,通过学习和实践这些内容,你可以更深入地掌握这两种技术。

Global site tag (gtag.js) - Google Analytics