`
liuguly
  • 浏览: 10223 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

代理模式+反射自定义实现简单AOP功能

 
阅读更多
熟悉代理模式的基础上,首先使用反射实现动态调用某个对象的某个方法,目的就是某个对象某个方法可以进行配置,使用XML或者使用后缀名properties文件。
代码如下:
  1import java.lang.reflect.Method
  2public class ReflectUtils{
  3     private Class clazz;  //目标对象的类
  4     private Method method; //目标对象的方法
  5     private Object target; //目标对象
  6     private Object[] params; //目标方法的参数
  7 
  8     public ReflectUtils(Object targer,String methodName,Object params){
  9         locateTarget(target,methodName,params);
 10     }

 11     public void locateTarget(Object target,String methodName,Object params){
 12        this.target = target;   //绑定目标对象
 13        this.clazz = target.getClass(); //绑定目标对象类
 14        locateMethod(methodName,params);
 15     }

 16     public void locateMethod(String methodName,Object params){
 17        this.params=params;
 18        Class[] cls = new Class[params.length()];
 19        for(int i=0;i<params.length;i++){
 20             cls[i]=params[i].getClass();
 21        }

 22    try{
 23        this.method = clazz.getMethod(methodName,cls); //组装好该方法类
 24    }
catch(Exception e){
 25    }
    
 26}

 27     public void invokeMethod(){
 28try{
 29        this.method.invoke(target,params); //调用该方法
 30    }
catch(Exception e){
 31    }

 32}

 33}

 34下面给出测试例子
 35/** *//**
 36 *
 37 * 定义一个接口
 38 **/

 39public interface Crud{
 40     public void add(UserInfo user);
 41     public void modify(UserInfo user);
 42     public void delete(UserInfo user);
 43}

 44/** *//**
 45 *
 46 * 接口实现类
 47 **/

 48public CrudImpl implements Crud{
 49     public void add(UserInfo user){
 50     System.out.println("新增用户:"+new UserInfo("lx","25").getName());
 51     }

 52     public void modify(UserInfo user){
 53     System.out.println("修改用户:"+new UserInfo("lx","25").getName());
 54     }

 55     public void delete(UserInfo user){
 56     System.out.println("删除用户:"+new UserInfo("lx","25").getName());
 57     }

 58}

 59/** *//**
 60 *
 61 * 定义横向切面的类
 62 **/

 63public class Crosscutting{
 64   public void before(){
 65   System.out.println("前置");
 66   }

 67   public void after(){
 68   System.out.println("后置");
 69   }

 70}

 71/** *//**
 72 *
 73 * 定义配置文件,使用parameters.properties文件
 74 **/

 75method=modify
 76/** *//**
 77 *
 78 * 定义测试类
 79 **/

 80public class Test{
 81    private static Crosscutting cut = new Crosscutting(); // 横切面的东西,可使用ioc进行配置
 82    private static ReflectUtils rf_before = new ReflectUtils(cut, "before");
 83    //这个cut就代表AOP里面的横切面 before代表织入点 同下
 84    private static ReflectUtils rf_after = new ReflectUtils(cut, "after");
 85    //前置通知
 86    public void beforeActive(Object target,String methodName,object params){
 87             Class cls = target.getClass();
 88             Method[] methods = cls.getDeclaredMethods();
 89             for(int i=0;i<methods.length;i++){
 90                   if (methods[i].getName().equals(method)) {
 91                        rf_before.invokeMethod();  //使用上面自定义动态代理类调用横切面的before方法
 92                        new ReflectUtils(obj, method, params).invokeMethod(); //使用上面的动态代理类调用核心目标方法
 93                   }

 94             }

 95     }

 96      //后置通知
 97      public static void afterActive(Object obj, String method, Object params) {
 98             Class cls = obj.getClass();
 99             Method[] methods = cls.getDeclaredMethods();
100             for (int i = 0; i < methods.length; i++{
101                    if (methods[i].getName().equals(method)) {
102                    new ReflectUtils(obj, method, params).invokeMethod();
103                    rf_after.invokeMethod();
104                   }

105              }

106      }

107      //环绕通知
108     public static void aroundActive(Object obj, String method, Object params){
109             Class cls = obj.getClass();
110             Method[] methods = cls.getDeclaredMethods();
111             for (int i = 0; i < methods.length; i++{
112                    if (methods[i].getName().equals(method)) {
113                     rf_before.invokeMethod();
114                     new ReflectUtils(obj, method, params).invokeMethod();
115                     rf_after.invokeMethod();
116                     }

117             }

118      }

119//main方法测试
120public static void main(String[] args) throws Exception{
121      Crud crud = new CrudImpl(); // 业务bean可使用IOC进行装配
122      UserInfo user = new UserInfo("lx""25"); // 实体bean可以使用IOC进行装配
123      // 读取配置文件 获得要拦截的方法名字 相当于XML
124       InputStream is = Test.class.getResourceAsStream("parameters.properties");
125       Properties props = new Properties();
126       props.load(is);
127       String method = props.getProperty("method");
128       beforeActive(crud,method,user); //测试前置通知
129       afterActive(crud,method,user);//测试后置通知    
130//修改parameters.properties文件里面的method名字 比如add modify delete 那么就会对方法实现拦截调用横切面的方法 以上纯属自我摸索~
131}

132}

133 
134}
分享到:
评论

相关推荐

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    利用C#实现AOP常见的几种方法详解

    C#支持特性(Attribute),可以定义自定义特性来表示切面,并在运行时通过反射找到并执行这些特性。这种方式简单易用,但可能会导致代码可读性下降,且需要在运行时解析特性,性能上可能不如前两者。 4. **拦截器...

    AOP的实现机制.

    1. 静态代理:通过Java反射API或者自定义接口实现,缺点是需要为每个目标类手动创建代理类。 2. 动态代理:Java提供两种动态代理方式,JDK动态代理和CGLIB代理。 - JDK动态代理:基于接口实现,适用于目标对象实现...

    Spring AOP面向切面三种实现

    Spring AOP提供了三种实现方式:代理模式、AspectJ切面和注解驱动的切面。 1. **代理模式** Spring AOP的基础是动态代理,它可以创建目标对象的代理对象来实现切面功能。有两种代理方式:JDK动态代理和CGLIB代理。...

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...

    [干货][EMIT]千行代码实现代理式AOP+属性的自动装配 V2.0

    本篇文章将围绕如何利用.NET的 Emit 功能实现代理式AOP以及属性的自动装配进行深入探讨。 Emit 是.NET框架提供的一种动态方法生成技术,它允许程序员在运行时构建和执行Microsoft中间语言(MSIL)。通过Emit,我们...

    利用Java的反射与代理实现IOC模式

    代理(Proxy)是一种设计模式,主要用于在不修改原有对象的基础上增加额外的功能或行为。在Java中,静态代理可以通过定义一个代理类来实现,而动态代理则使用`java.lang.reflect.Proxy`类和`java.lang.reflect....

    理解Spring AOP实现与思想 案例代码

    这主要通过代理模式实现,使得我们可以集中处理系统中横切关注点,如日志、事务管理、权限控制等,提高代码的可维护性和可复用性。 1. **AOP概念** - **切面(Aspect)**:切面是关注点的模块化,包含了横切关注点...

    Java设计模式-代理模式

    代理模式的应用非常广泛,例如在AOP(面向切面编程)中,代理模式用于实现切面逻辑,如事务管理、性能监控等。此外,还可以用于远程调用、安全控制、缓存等场景。 总结来说,Java设计模式中的代理模式提供了一种...

    基于事件(AOP)的concurrent线程池

    标题中的“基于事件(AOP)的concurrent线程池”是指一种...总结来说,基于事件的AOP线程池是一种创新的并发编程模式,它结合了AOP的强大功能和Java并发库的灵活性,使得在多线程环境中处理复杂逻辑变得更加简单和可控。

    基于realproxy的aop使用示例

    C#中实现AOP的一种方式是通过RealProxy类,这涉及到对.NET的反射和代理技术的深入理解。 RealProxy是.NET框架提供的一种机制,可以创建一个透明的代理类,用于在运行时控制对远程对象或本地对象的访问。在AOP上下...

    spring aop 学习笔记

    - Spring AOP的实现涉及到反射、动态代理、代理模式等多个核心Java技术。 - `org.springframework.aop.framework.ProxyFactoryBean` 和 `org.springframework.aop.framework.JdkDynamicAopProxy` 是动态代理的关键...

    Spring AOP学习资料(pdf)

    编程方式**:通过自定义类实现Spring提供的AOP接口,如`MethodBeforeAdvice`、`AfterReturningAdvice`等。 #### 五、Spring AOP 的应用场景 Spring AOP广泛应用于以下场景: - **日志记录**:自动记录方法调用的...

    java反射机制与动态代理

    1. **框架开发**: Spring、Hibernate等框架大量使用反射和动态代理技术,实现依赖注入、AOP等核心功能。 2. **元数据操作**: ORM框架如MyBatis通过反射快速映射数据库字段与Java对象。 3. **插件开发**: 如Junit...

    C#反射、委托技术在设计模式中的应用

    - 代理模式:反射可用于动态创建代理类,实现对目标对象的透明拦截,从而实现AOP(面向切面编程)。 - 动态代理:System.Reflection.Emit命名空间的类允许在运行时构建类型,这对于创建动态代理或实现自定义的元...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...

    CGLib代理模式用到的jar包

    在Java世界里,代理模式是一种常见的设计模式,它允许我们创建对象的代理来控制对原对象的访问。CGLib是Java中实现动态代理的一种方式,尤其是在Spring AOP(面向切面编程)中被广泛应用。 CGLib代理主要分为两种...

    Unity DLL注入,支持全平台,支持Mono和IL2CPP,支持注入引擎和用户DLL。可以实现AOP、装饰器等功能.zip

    这个DLL可以包含静态方法、动态代理或其他实现AOP和装饰器模式的结构。 2. **加载DLL**:Unity并不直接支持动态加载DLL,但可以通过反射(Reflection)技术在运行时加载外部DLL。利用`Assembly.Load`或`Assembly....

Global site tag (gtag.js) - Google Analytics