AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。例如,在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

总结,所有设计模式追求的是调用者与被调用者的解耦(这样可以提高代码的灵活性和可扩展性),AOP作为一种设计模式的延伸,它分离了应用的业务逻辑与系统级服务(不仔细分都是业务逻辑),通过预编译和动态代理实现程序功能的。(想一想shtml中的#include,[Obsolete("hehe", false)]不也是一种标记,然后动态执行吗,另外,预处理和动态执行应该总是结合在一起使用的)

  1. public class test1 : IHttpHandler
  2. {
  3. [ObsoleteAttribute("hehe", false)]
  4. public void ProcessRequest(HttpContext context)
  5. {
  6.  
  7. Type type = typeof(test1);
  8. object[] attr = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(ObsoleteAttribute), false);
  9. ObsoleteAttribute ra= (ObsoleteAttribute)attr[];
  10. string ss = ra.Message; //hehe
  11. bool ii = ra.IsError; //false
  12.  
  13. }
  1. Attribute可以省略,附加的Attribute类中的属性只能是常量。([ObsoleteAttribute(DateTime.Now.ToString(), false)],是错误的)。
  1.  
  1.  自定义Attribute
  1. public class LsAttribute:Attribute
  2. {
  3.  
  4. private string message;
  5.  
  6. public string Message
  7. {
  8. get { return this.message; }
  9. set { this.message = value; }
  10. }
  11. public LsAttribute(string message) {
  12. Message = message;
  13. }
  14. public LsAttribute() { }
  15.  
  16. }
  17. }

完整调用

  1. [Obsolete("hehe", false)]
  2. //[LsAttribute(Message = "first")] 第一种方式
  3. [LsAttribute("second")] //第二种方式
  4. public void ProcessRequest(HttpContext context)
  5. {
  6. context.Response.ContentType = "application/json";
  7. string action = context.Request["action"];
  8. if (action == "test")
  9. {
  10. string checkUserName = context.Request["checkUserName"];
  11. string username = context.Request["username"];
  12. string CheckPwd = context.Request["CheckPwd"];
  13. string password = context.Request["password"];
  14. if (checkUserName == "on" && CheckPwd == "on")
  15. {
  16. AjaxHelper.WriteJson(context.Response, "ok", "", new { username = username, password = password });
  17. }
  18. }
  19.  
  20. Type type = typeof(test1);
  21.  
  22. object[] attr1 = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(ObsoleteAttribute), false);
  23. ObsoleteAttribute ra = (ObsoleteAttribute)attr1[];
  24. string ss = ra.Message;
  25. bool ii = ra.IsError;
  26.  
  27. object[] attr2 = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(LsAttribute), false);
  28. LsAttribute ls=(LsAttribute)attr2[];
  29. string lsMessage = ls.Message;
  30.  
  31. }

最后应用到实际BaseHandler

  1. public class BaseHandler:IHttpHandler,IRequiresSessionState
  2. {
  3. public bool IsReusable
  4. {
  5. get
  6. {
  7. return false;
  8. }
  9. }
  10.  
  11. public void ProcessRequest(HttpContext context)
  12. {
  13. AdminHelper.CheckAccess(context);
  14. string action=context.Request["action"];
  15. //规定:参数总都有一个action 参数,表示执行什么方法
  16. //action要和处理这个action的方法名一样,并且有如下参数(HttpContext context)
  17. //例如 action=list,则有一个方法 public void list(HttpContext context)
  18. Type ctrlType = this.GetType();//得到子类类型,例如,CourseController
  19. MethodInfo methodAction = ctrlType.GetMethod(action);//例如,拿到子类的list方法
  20. if (methodAction==null)
  21. {
  22. throw new Exception("action 不存在");
  23. }
  24. object[] paAttrs = methodAction.GetCustomAttributes(typeof(PowerActionAttribute), false);
  25. if (paAttrs.Length>)
  26. {
  27. PowerActionAttribute powerAction=(PowerActionAttribute)paAttrs[];
  28. AdminHelper.CheckPower(powerAction.Name);
  29. }
  30. methodAction.Invoke(this, new object[] { context });
  31. }
  32. }
  1. PowerActionAttribute
  1. [AttributeUsage(AttributeTargets.Method)]
  2. public class PowerActionAttribute:Attribute
  3. {
  4. public string Name { get; set; }
  5. public PowerActionAttribute(string name)
  6. {
  7. this.Name = name;
  8. }
  9. }
  1.  

利用反射+AOP,封装Basehandler的更多相关文章

  1. 事务框架之声明事务(自动开启,自动提交,自动回滚)Spring AOP 封装

    利用Spring AOP 封装事务类,自己的在方法前begin 事务,完成后提交事务,有异常回滚事务 比起之前的编程式事务,AOP将事务的开启与提交写在了环绕通知里面,回滚写在异常通知里面,找到指定的 ...

  2. Java JDBC利用反射技术将查询结果封装为对象

    1.JDBC将返回结果集封装成对象demo class JdbcDemo { /** * 获取数据库列名 * @param rs * @return */ private static String[ ...

  3. jdbc操作mysql(四):利用反射封装

    前言 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢 实践操作 工具类:获取connection对象 publ ...

  4. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  5. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  6. 利用spring AOP 实现统一校验

    开发环境 JDK: 1.7 spring: 4.0.6 aspect: 1.7.4 应用背景   在APP与后台通讯的过程中,我们一般都会有个authToken的字符串校验,判断那些请求是需要校验用户 ...

  7. 利用jdbc简单封装一个小框架(类似DBUtils)

    利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...

  8. Java开发笔记(七十九)利用反射技术操作私有属性

    早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...

  9. Java开发笔记(八十)利用反射技术操作私有方法

    前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用.为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get** ...

随机推荐

  1. zookeeper+jstorm的集群搭建

    zookeeper的配置: zookeeper有三种配置方式:单机式/伪分布式/集群式 其中伪分布式是在一台电脑上通过不同的端口来模拟分布式情形,需要N份配置文件和启动程序,而集群式是多个zookee ...

  2. oracle 查询结果集运算

    intersec:交集minus:差集union:进行表连接后会筛选掉重复的记录,表连接之后对结果进行排序运算,删除重复记录在返回结果. union all:只是简单的将两个结果合并就返回.无论是否有 ...

  3. docker 组件(c/s)

    Docker 组件 1. docker client : docker的客户端 2. docker server : docker daemon的主要组成部分,接受用户通过docker client发 ...

  4. PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂

    当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究.   到网上一搜php无限极分类,很多,但好多都是一 ...

  5. 利用pip安装模块(以安装pyperclip为例)

    >任务:利用pip安装pyperclip模块 >前提:你已经在你的电脑里面安装啦Python2.7的Windows版本,并且已经配置了环境变量 >实现步骤 >>打开你的P ...

  6. 如何使用抓包工具fiddler对app进行接口分析

    如果你还不知道什么是抓包,点我 如果你还不知道什么是http,点它 如果你想知道什么是fiddler 什么是接口测试 正文来了.安装fiddler后,打开界面,点击tools,找到如图的options ...

  7. 吓哭原生App的HTML5离线存储技术,却出乎意料的容易!【低调转载】

    吓哭原生App的HTML5离线存储技术,却出乎意料的容易![WeX5低调转载] 2015-11-16 lakb248 起步软件 近几天,WeX5小编编跟部分移动应用从业人士聊了聊,很多已经准备好全面拥 ...

  8. People Tools catalog tables.

    People Tools catalog tables. Projects PSPROJECTDEFN — Project header table PSPROJECTITEM — Definitio ...

  9. ubuntu command

    uninstall software: sudo apt-get purge openjdk*

  10. PHP 使用编码树,生成easyui中的tree样式

    生成树的时候,数据库中一般设计的都为无级数,即为:父子节点的树,例如:基本的数据表设计为: nodecode 节点编码 parentnodecode 父节点编码 nodename  节点名称 这样的形 ...