`

反射实现 AOP 动态代理模式(1)

阅读更多

其实AOP的意思就是面向切面编程.
OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!
还是拿人家经常举的一个例子讲解一下吧:
比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录,
我们写个例子看看我们最简单的解决方案
我们先写一个接口IHello.java代码如下:

 1package sinosoft.dj.aop.staticaop;
 2
 3public interface IHello {
 4    /** *//**
 5     * 假设这是一个业务方法
 6     * @param name
 7     */

 8    void sayHello(String name);
 9}

10


里面有个方法,用于输入"Hello" 加传进来的姓名;我们去写个类实现IHello接口

package sinosoft.dj.aop.staticaop;

public class Hello implements IHello {

    
public void sayHello(String name) {
        System.out.println(
"Hello " + name);
    }


}


现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:

 1package sinosoft.dj.aop.staticaop;
 2
 3public class HelloProxy implements IHello {
 4    private IHello hello;
 5
 6    public HelloProxy(IHello hello) {
 7        this.hello = hello;
 8    }

 9
10    public void sayHello(String name) {
11        Logger.logging(Level.DEBUGE, "sayHello method start.");
12        hello.sayHello(name);
13        Logger.logging(Level.INFO, "sayHello method end!");
14
15    }

16
17}

18


其中.Logger类和Level枚举代码如下:
Logger.java

 1package sinosoft.dj.aop.staticaop;
 2
 3import java.util.Date;
 4
 5public class Logger{
 6    /** *//**
 7     * 根据等级记录日志
 8     * @param level
 9     * @param context
10     */

11    public static void logging(Level level, String context) {
12        if (level.equals(Level.INFO)) {
13            System.out.println(new Date().toLocaleString() + " " + context);
14        }

15        if (level.equals(Level.DEBUGE)) {
16            System.err.println(new Date() + " " + context);
17        }

18    }

19
20}

21

Level.java

1package sinosoft.dj.aop.staticaop;
2
3public enum Level {
4    INFO,DEBUGE;
5}

6

那我们去写个测试类看看,代码如下:
Test.java

1package sinosoft.dj.aop.staticaop;
2
3public class Test {
4    public static void main(String[] args) {
5        IHello hello = new HelloProxy(new Hello());
6        hello.sayHello("Doublej");
7    }

8}

9

运行以上代码我们可以得到下面结果:

Tue Mar 04 20:57:12 CST 2008 sayHello method start.
Hello Doublej
2008-3-4 20:57:12 sayHello method end!


从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:

1package sinosoft.dj.aop.staticaop;
2
3public class Test {
4    public static void main(String[] args) {
5        IHello hello = new Hello();
6        hello.sayHello("Doublej");
7    }

8}

9


上面代码,可以说是AOP最简单的实现!
但是我们会发现一个问题,如果我们像Hello这样的类很多,那么,我们是不是要去写很多个HelloProxy这样的类呢.没错,是的.其实也是一种很麻烦的事.在jdk1.3以后.jdk跟我们提供了一个API   java.lang.reflect.InvocationHandler的类. 这个类可以让我们在JVM调用某个类的方法时动态的为些方法做些什么事.让我们把以上的代码改一下来看看效果.
同样,我们写一个IHello的接口和一个Hello的实现类.在接口中.我们定义两个方法;代码如下 :

IHello.java

 1package sinosoft.dj.aop.proxyaop;
 2
 3public interface IHello {
 4    /** *//**
 5     * 业务处理A方法
 6     * @param name
 7     */

 8    void sayHello(String name);
 9    /** *//**
10     * 业务处理B方法
11     * @param name
12     */

13    void sayGoogBye(String name);
14}

15



Hello.java

 1package sinosoft.dj.aop.proxyaop;
 2
 3public class Hello implements IHello {
 4
 5    public void sayHello(String name) {
 6        System.out.println("Hello " + name);
 7    }

 8    public void sayGoogBye(String name) {
 9        System.out.println(name+" GoodBye!");
10    }

11}

12


我们一样的去写一个代理类.只不过.让这个类去实现java.lang.reflect.InvocationHandler接口,代码如下:

 1package sinosoft.dj.aop.proxyaop;
 2
 3import java.lang.reflect.InvocationHandler;
 4import java.lang.reflect.Method;
 5import java.lang.reflect.Proxy;
 6
 7public class DynaProxyHello implements InvocationHandler {
 8
 9    /** *//**
10     * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
11     */

12    private Object delegate;
13
14    /** *//**
15     * 动态生成方法被处理过后的对象 (写法固定)
16     * 
17     * @param delegate
18     * @param proxy
19     * @return
20     */

21    public Object bind(Object delegate) {
22        this.delegate = delegate;
23        return Proxy.newProxyInstance(
24                this.delegate.getClass().getClassLoader(), this.delegate
25                        .getClass().getInterfaces(), this);
26    }

27    /** *//**
28     * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
29     * 此方法是动态的,不是手动调用的
30     */

31    public Object invoke(Object proxy, Method method, Object[] args)
32            throws Throwable {
33        Object result = null;
34        try {
35            //执行原来的方法之前记录日志
36            Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
37            
38            //JVM通过这条语句执行原来的方法(反射机制)
39            result = method.invoke(this.delegate, args);
40            //执行原来的方法之后记录日志
41            Logger.logging(Level.INFO, method.getName() + " Method Start!");
42        }
 catch (Exception e) {
43            e.printStackTrace();
44        }

45        //返回方法返回值给调用者
46        return result;
47    }

48
49}

50


上面类中出现的Logger类和Level枚举还是和上一上例子的实现是一样的.这里就不贴出代码了.

分享到:
评论

相关推荐

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

    AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理

    反射实现aop 动态代理

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

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

    NULL 博文链接:https://arne3166.iteye.com/blog/1046340

    复习反射利用反射机制和AOP代理模式

    reflection是一系列的API,用于表示或者处理当前JVM中的类,接口和对象. java.lang.reflect/java.lang.Class 在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

    spring 代理模式

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

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

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

    利用Java的反射与代理实现IOC模式 在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的...

    Java反射和动态代理实例

    几个Java反射和动态代理的小例子。可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变...可以学习Java的动态代理模式、学习Java工厂模式以及如何将工厂模式与属性文件相结合。

    通用动态代理链-为你的应用程序添加AOP

    这篇文章并不打算对AOP作深入的讨论,而准备把重点放在动态代理的一般链化上,从而使开发者可以用以框架驱动的方法去实现一些AOP概念。如果一个项目早已使用用某些现存的AOP框架,那么开发者不用再担心实现一个定制...

    Java动态代理简单应用

     代理模式是基本的设计模式之一,它是开发者为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色。  Java动态代理比代理...

    13Spring知识点1

    反射:动态代理设计模式 1.jdk 依赖接口 newProxyInstance方法 2.cglb 实现MethodInterceptor Aop 四种通知之前通

    JAVA Reflection(反射机制)

     代理模式  Java动态代理  简单的Aop实现  “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。  尽管在这样...

    JAVA高并发高性能高可用高扩展架构视频教程

    揭开springAOP神秘面纱(动态代理) Mysql性能优化之索引优化 写实现Tomcat服务器 移动后台端框架设计 公司级框架原理解析 解密公司内部框架开发(打造属于自己的专属框架) 手写Tomca之深度解析动态资源请求原理 深度...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    Java 基础核心总结 +经典算法大全.rar

    代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    积分管理系统java源码-knowledge:这是我的知识,包括我所有已知的

    代理模式 策略模式 原型模式 工厂模式 委托 其他 Spring5 IOC容器设计原理及高级特性 AOP设计原理 FactoryBean和BeanFactory Spring事务处理机制 Spring JDBC Spring MVC九大组件 手动实现Spring MVC Spring5新特性 ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板...

    spring:Spring框架

    代理模式 是一种设计模式,主要解决在直接访问对象时代理的问题。通过代理对象访问目标对象,可以在目标对象实现的基础上,增加额外的功能,即扩展目标对象的功能。 分类: 静态代理:由程序员创建或工具生成代理类...

    simple-framework:基于Servlet的轻量级JavaWeb框架的实现

    Simple-Framework使用文档​Simple-Framework是一种轻量级Java Web框架,可基于此框架进行...​实现过程中使用到的技术有:Tomcat、Servlet 、JDBC、数据库、反射、CGLIB动态代理、设计模式(模板模式、责任链模式)、Thr

Global site tag (gtag.js) - Google Analytics