使用动态代理和反射机制简单模拟struts2拦截器机制

标签: 代理 反射 模拟 | 发表时间:2012-11-22 22:09 | 作者:
出处:http://www.iteye.com

根据动态代理的机制,先创建抽象类TargetInterface如下:

public interface TargetInterface
{
	public void doSomething();
}

 创建目标对象Target实现抽象类如下:

public class Target implements TargetInterface
{
	public void doSomething()
	{
		System.out.println("do something");
	}
}

 创建拦截器类(只是模拟,只写两个简单的方法)Interceptor如下:

public class Interceptor
{
	public void before()
	{
		System.out.println("before");
	}
	
	public void after()
	{
		System.out.println("after");
	}
}

 

代理类方法执行类MyHandler如下:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyHandler implements InvocationHandler
{
	private Object object;

	private Interceptor interceptor = new Interceptor();

	public void setObject(Object object)
	{
		this.object = object;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		Object result = null;

		interceptor.before();

		result = method.invoke(object, args);

		interceptor.after();

		return result;

	}

}

 代理类MyProxy如下:

import java.lang.reflect.Proxy;

public class MyProxy
{
	public Object getProxy(Object object)
	{
		MyHandler myHandler = new MyHandler();

		myHandler.setObject(object);

		return Proxy.newProxyInstance(Target.class.getClassLoader(), object
				.getClass().getInterfaces(), myHandler);
	}
}

 

最后测试类client如下:

public class Client
{
	public static void main(String[] args)
	{
		TargetInterface target = new Target();
		
		MyProxy myProxy = new MyProxy();
		
		TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
		
		proxy.doSomething();
	}

}

 

基本工作流程是:在测试类中声明抽象类的对象并且指向目标类的对象,声明一个代理类,调用代理类动态方法getProxy(target)方法,并且把生气的指向目标类的对象作为参数传进来,流程进入到getProxy方法当中如下

public Object getProxy(Object object)
	{
		MyHandler myHandler = new MyHandler();

		myHandler.setObject(object);

		return Proxy.newProxyInstance(Target.class.getClassLoader(), object
				.getClass().getInterfaces(), myHandler);
	}

 

在方法体内声明了一个代理类的方法执行类的对象myHandler,并调用对象的set方法为对象object即抽象类的对象赋值,然后调用Proxy的newProxyInstance()方法,其中第一个参数被代理类的类加载器,第二个参数是Proxy的newProxyInstance方法返回的对象默认实现第二个参数所代表接口。第三个是方法处理类。当返回的对象调用方法时,会自动调用myHandler的invoke方法,调用myHandler类中的object即抽象类。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [代理 反射 模拟] 推荐:

使用动态代理和反射机制简单模拟struts2拦截器机制

- - ITeye博客
根据动态代理的机制,先创建抽象类TargetInterface如下:.  创建目标对象Target实现抽象类如下:.  创建拦截器类(只是模拟,只写两个简单的方法)Interceptor如下:. 代理类方法执行类MyHandler如下:.  代理类MyProxy如下:. 最后测试类client如下:.

情景反射陷阱

- 烙饼 - 坏脾气的小肥
情景这个词,很多人称之为场景,都是一个意思. 我喜欢用“情景”,是因为场景的语感更偏重环境描述,而情景则附带有该环境下的直观感受这层意思. 最近一年,我带的几个项目有得有失,大都踩到了同一颗地雷,即“情景反射陷阱”. 这枚生造词的意思是,当用户接触到产品的时候印象尚可,但一旦关闭窗口,就很难想到再回来使用,缺乏刺激用户“再去用那款产品”的条件反射情景.

[翻译]反射的规则

- stern - Some reminiscences, some memories
第一次知道反射的时候还是许多年前在学校里玩 C# 的时候. 那时总是弄不清楚这个复杂的玩意能有什么实际用途……然后发现 Java 有这个,后来发现 PHP 也有了,再后来 Objective-C、Python 什么的也都有……甚至连 Delphi 也有 TRttiContext……反射无处不在. Go 作为一个集大成的现代系统级语言,当然也需要有,必须的.

【反射】教你在十分钟内学会反射

- Xin - 博客园-首页原创精华区
  反射,提供了封装程序集、模块和类型的对象(Type 类型). 可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性. 如果代码中使用了属性,可以利用反射对它们进行访问. 其实反射很简单的,理解了调用的过程再自己动手做几个实例基本上就能熟悉了.   对于反射,我们需要准备好一个类库,编译出DLL文件,然后通过System.Reflection命名空间下的 Assembly类来加载这个程序集:.

JavaScript PC 模拟器

- kira - LinuxTOY
很难想象竟然用了这么久,Linux 才可以运行在浏览器的 JavaScript 引擎里面,要知道2008 年就可以在土豆上运行了~. 作者 Fabrice Bellard 使用 JavaScript 编写了一个简单的 PC 模拟器,包含32位 x86 兼容 CPU、8259 可编程中断控制器、8254 可编程中断计时器.

【转】java 反射的局限性

- - Java - 编程语言 - ITeye博客
今天公司的JAVA项目碰到一个问题:在生成xls文件的时候,如果数据较多,会出现ArrayIndexOutOfBoundsException. Google发现是项中所用的jxl包(开源库,用以处理xls文件)的一个BUG. 也找到了一个解决办法: http://www.blogjava.net/reeve/archive/2013/01/11/114564.html——即找到它的源代码,修改其中的一个静态常量,然后重新打包成jar即可.

JavaScript Gameboy Color模拟器

- ashuai - Solidot
程序员Grant Galitz发布了一个用HTML5/JavaScript编写的GameBoy Color模拟器(源代码),可以运行储存在本地的ROM镜像,游戏运行速度正常. 也有其他开发者用JavaScript编写出了启动Linux的X86模拟器.

地形模拟演示Demo

- kongshanzhanglao - 博客园-首页原创精华区
地形渲染的首先是创建一个三角网络平面,然后调整平面顶点的y高度值,模拟地面的山丘和山谷,最后再绘制贴图效果. 本文首先介绍如何生成三角网络平面. 然后介绍如何通过高度图调整平面高度. 以及使用BlendMap和3种材质绘制贴图效果的方法. 最后演示如何调整摄像机位置和移动速度,在地面上行走. 一个m*n个顶点的平面由2*(m-1)*(n-1)个三角形组成.

模拟银河系的演化

- Yan - Solidot
加州大学Santa Cruz分校和瑞士苏黎世理论物理研究院科的科学家利用NASA的Pleiades超级计算机,历时9个月时间的运算,模拟了星系的起源和演化. 预印本发表在arXiv.org上. 他们所模拟的星系称为Eris. 研究小组首先从低分辨率开始,模拟最初的暗物质演化成一个类银河星系的控制中心,然后放大中心光环区,引入气体粒子并大幅度提高分辨率,再追踪粒子间的相互作用的演化.

俄亥俄州模拟僵尸入侵

- phus - Solidot
俄亥俄州特拉华县(Delaware County)联邦紧急事务管理局举行了一场僵尸入侵模拟演习,有超过225个志愿者打扮成了僵尸. 组织者希望,僵尸主题的模拟演习能比工业事故或车祸演习吸引更多的人参与. 当地的一位发言人称,特拉华县的人迷上了僵尸. 这一演习是受到了美国疾病控制和预防中心的僵尸预警指南的启发.