用了这久的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,以便于读者理解并实践。 #### 二、面向切面编程(AOP)简介 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在通过将横切关注点与...
Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...
在Java环境中实现AOP时,可以使用Java的动态代理机制。以下是一个简单的示例,展示了如何使用Java反射API实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import...
Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的代码,如日志、事务管理、权限检查等...文件列表中的"java实现aop案例"可能是示例代码或相关资源,供读者下载和实践。
Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...
动态代理(Aspect-Oriented Programming,AOP)是面向切面编程的一种编程范式,它主要用来解决传统面向对象编程中难以处理的横切关注...这个例子对于初学者来说是一个很好的实践,有助于深入理解AOP和动态代理的概念。
Java原生代理(Java Native Interface...虽然Java原生代理在功能上比专门的AOP框架如Spring AOP有限,但它对于理解AOP原理和实践是一个很好的起点。在实际开发中,根据项目需求和性能考虑,可以选择合适的方式实现AOP。
代理设计模式是软件开发中的一种重要模式,它允许我们在不修改原有对象的基础上,通过代理对象对原对象进行增强或控制。本资源主要涵盖了静态...通过学习和实践,你可以更好地掌握代理设计模式以及Spring AOP的使用。
总之,AOP是提高代码复用和模块化的重要工具,Java中的静态和动态代理提供了实现AOP的途径。通过研究这个项目中的代码,开发者可以深化对AOP原理和实践的理解,并将其应用于实际项目中,提升代码质量和可维护性。
在软件设计领域,模式是一种解决...总之,动态代理和Spring AOP是Java开发中强大的工具,它们能帮助我们构建更灵活、可扩展的系统。通过学习和实践,我们可以更好地理解和利用这两个概念,提升代码质量,降低维护成本。
总结一下,这个资源为你提供了一个深入理解Java AOP的实践平台,涵盖了CGLIB、Javassist和Java动态代理三种常见的实现方式。通过研究并运行这些示例,你将能够更好地理解和运用面向切面编程这一强大的设计模式,提升...
这个“Java动态代理学习测试类”可以帮助我们理解和实践Java动态代理的原理和使用,进一步提升我们对Java语言特性的掌握。通过实际编写和运行代码,我们可以更直观地看到动态代理如何工作,从而更好地应用到实际项目...
在Day01_AutoAOP的学习资料中,你可能将深入理解Spring AOP的原理,实践自动代理的配置,并通过示例代码体验如何使用AOP进行日志记录、事务管理和权限控制等功能。这将有助于提升你在JavaEE开发中的能力,使你的代码...
- **配置Spring AOP**:首先,我们需要在Spring配置文件中启用AOP代理。通常,对于基于注解的配置,会使用`<aop:aspectj-autoproxy>`标签;对于XML配置,可以使用`<aop:config>`和`<aop:pointcut>`定义切点。 ```...
Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务...因此,深入学习和实践Java AOP是提升Java开发能力的重要一步。
ByteBuddy是Java的一个库,用于在运行时创建和修改Java类和接口,它是创建Java代理或者实现AOP(面向切面编程)框架的理想工具。在本项目"基于Bytebuddy的Java Agent AOP框架.zip"中,我们将探讨如何使用ByteBuddy...
Java AOP通常使用代理模式实现,Spring框架提供了两种主要的代理方式:JDK动态代理和CGLIB代理。JDK代理适用于接口实现类,而CGLIB代理则针对没有实现接口的类。 IOC,即控制反转,是对象依赖关系的反转。在传统的...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,实现在调用原有...通过学习和实践动态代理,你可以更好地理解和应用AOP编程模式,提升你的Java编程技能。
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活...在提供的压缩包文件"JavaReflect"中,可能包含了关于Java反射和动态代理的示例代码和教程,通过学习和实践这些内容,你可以更深入地掌握这两种技术。