利用反射+AOP,封装Basehandler
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。例如,在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
总结,所有设计模式追求的是调用者与被调用者的解耦(这样可以提高代码的灵活性和可扩展性),AOP作为一种设计模式的延伸,它分离了应用的业务逻辑与系统级服务(不仔细分都是业务逻辑),通过预编译和动态代理实现程序功能的。(想一想shtml中的#include,[Obsolete("hehe", false)]不也是一种标记,然后动态执行吗,另外,预处理和动态执行应该总是结合在一起使用的)
public class test1 : IHttpHandler
{
[ObsoleteAttribute("hehe", false)]
public void ProcessRequest(HttpContext context)
{ Type type = typeof(test1);
object[] attr = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(ObsoleteAttribute), false);
ObsoleteAttribute ra= (ObsoleteAttribute)attr[];
string ss = ra.Message; //hehe
bool ii = ra.IsError; //false }
Attribute可以省略,附加的Attribute类中的属性只能是常量。([ObsoleteAttribute(DateTime.Now.ToString(), false)],是错误的)。
自定义Attribute
public class LsAttribute:Attribute
{ private string message; public string Message
{
get { return this.message; }
set { this.message = value; }
}
public LsAttribute(string message) {
Message = message;
}
public LsAttribute() { } }
}
完整调用
[Obsolete("hehe", false)]
//[LsAttribute(Message = "first")] 第一种方式
[LsAttribute("second")] //第二种方式
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
string action = context.Request["action"];
if (action == "test")
{
string checkUserName = context.Request["checkUserName"];
string username = context.Request["username"];
string CheckPwd = context.Request["CheckPwd"];
string password = context.Request["password"];
if (checkUserName == "on" && CheckPwd == "on")
{
AjaxHelper.WriteJson(context.Response, "ok", "", new { username = username, password = password });
}
} Type type = typeof(test1); object[] attr1 = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(ObsoleteAttribute), false);
ObsoleteAttribute ra = (ObsoleteAttribute)attr1[];
string ss = ra.Message;
bool ii = ra.IsError; object[] attr2 = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(LsAttribute), false);
LsAttribute ls=(LsAttribute)attr2[];
string lsMessage = ls.Message; }
最后应用到实际BaseHandler
public class BaseHandler:IHttpHandler,IRequiresSessionState
{
public bool IsReusable
{
get
{
return false;
}
} public void ProcessRequest(HttpContext context)
{
AdminHelper.CheckAccess(context);
string action=context.Request["action"];
//规定:参数总都有一个action 参数,表示执行什么方法
//action要和处理这个action的方法名一样,并且有如下参数(HttpContext context)
//例如 action=list,则有一个方法 public void list(HttpContext context)
Type ctrlType = this.GetType();//得到子类类型,例如,CourseController
MethodInfo methodAction = ctrlType.GetMethod(action);//例如,拿到子类的list方法
if (methodAction==null)
{
throw new Exception("action 不存在");
}
object[] paAttrs = methodAction.GetCustomAttributes(typeof(PowerActionAttribute), false);
if (paAttrs.Length>)
{
PowerActionAttribute powerAction=(PowerActionAttribute)paAttrs[];
AdminHelper.CheckPower(powerAction.Name);
}
methodAction.Invoke(this, new object[] { context });
}
}
PowerActionAttribute
[AttributeUsage(AttributeTargets.Method)]
public class PowerActionAttribute:Attribute
{
public string Name { get; set; }
public PowerActionAttribute(string name)
{
this.Name = name;
}
}
利用反射+AOP,封装Basehandler的更多相关文章
- 事务框架之声明事务(自动开启,自动提交,自动回滚)Spring AOP 封装
利用Spring AOP 封装事务类,自己的在方法前begin 事务,完成后提交事务,有异常回滚事务 比起之前的编程式事务,AOP将事务的开启与提交写在了环绕通知里面,回滚写在异常通知里面,找到指定的 ...
- Java JDBC利用反射技术将查询结果封装为对象
1.JDBC将返回结果集封装成对象demo class JdbcDemo { /** * 获取数据库列名 * @param rs * @return */ private static String[ ...
- jdbc操作mysql(四):利用反射封装
前言 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢 实践操作 工具类:获取connection对象 publ ...
- 利用反射实现通用的excel导入导出
如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...
- c#反射机制学习和利用反射获取类型信息
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- 利用spring AOP 实现统一校验
开发环境 JDK: 1.7 spring: 4.0.6 aspect: 1.7.4 应用背景 在APP与后台通讯的过程中,我们一般都会有个authToken的字符串校验,判断那些请求是需要校验用户 ...
- 利用jdbc简单封装一个小框架(类似DBUtils)
利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...
- Java开发笔记(七十九)利用反射技术操作私有属性
早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...
- Java开发笔记(八十)利用反射技术操作私有方法
前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用.为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get** ...
随机推荐
- Scala的trait
一:说明 1.介绍 2.功能 二:具体解释功能 1.定义接口 2.定义方法 3.定义字段 4.定义抽象字段 5.混合trait
- 利用 crontab 來做 Linux 固定排程
crontab 介紹 crontab 是 Linux 內建的機制,可以根據設置的時間參數來執行例行性的工作排程. 上述這張圖可以清楚的顯示出前五項參數應該要帶進去的數字.依序是分鐘, 小時, 日期, ...
- Xcode使用HTTP配置
Xcode7 出现获取网络请求时出现如下异常: App Transport Security has blocked a cleartext HTTP (http://) resource load ...
- 学习laravel遇到的一些错误
Call to undefined method Illuminate\Foundation\Application::bindShared() 错误代码 Call to undefined meth ...
- JAVASE02-Unit09: 多线程基础
Unit09: 多线程基础 * 线程 * 线程用于并发执行多个任务.感官上像是"同时"执行 * * 创建线程有两种方式. * 方式一: * 继承线程并重写run方法来定义线程要执 ...
- oracle not in,not exists,minus 数据量大的时候的性能问题
http://blog.csdn.net/greenappple/article/details/7073349/ 耗时 minus<not exists<not in
- Docker容器时间与宿主机时间不一致的问题
通过date命令查看时间 查看主机时间 1 2 [root@localhost ~]# date 2016年 07月 27日 星期三 22:42:44 CST 查看容器时间 1 2 root@ ...
- Windows Live Writer体验
[安装] 首先下载安装包安装软件,没啥好说的,baidupan有记录: 顺便下载两个工具,备用: a)SourceCodePlugin_version_1.1.zip 将WindowsLiveWrit ...
- ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错
今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...
- Linux CentOS 中安装 MySql
CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 $ wget http://repo.mysql.com ...