`

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

阅读更多

根据动态代理的机制,先创建抽象类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
0
分享到:
评论

相关推荐

    Servlet简单模拟Struts2

    在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...

    利用java反射模拟struts2工作.doc

    下面我们将探讨如何利用Java反射模拟Struts2的工作原理。 首先,Struts2在启动时会读取配置文件,通常是`struts.xml`,该文件定义了各个Action及其对应的处理方法和结果页面。在模拟这个过程时,我们需要创建一个...

    自己模拟实现struts的dispatcherAction

    实际的Struts框架在DispatcherAction的实现上还考虑了拦截器(Interceptor)、多视图(多个Forward)支持、国际化(Internationalization)等问题,模拟实现时也可以考虑这些增强功能。 通过以上步骤,你可以理解...

    模拟struts2

    总的来说,模拟Struts2环境是学习和理解MVC框架以及Java Web开发的一个良好途径。通过对配置文件的调整和实际代码的编写,开发者可以深入掌握Struts2的工作原理和最佳实践。同时,熟悉反射机制对于理解框架的内部...

    java反射机制

    b) Struts2的拦截器:Struts2框架中的拦截器(Interceptor)是基于动态代理的,可以对Action调用前后的逻辑进行增强,例如验证用户输入、记录日志等。开发者可以自定义拦截器,通过配置文件决定拦截器链的执行顺序...

    java中三大框架和项目模拟面试题目[参考].pdf

    **过滤器Filter与Struts2拦截器的区别**: 1. 拦截器基于Java反射,过滤器基于函数回调。 2. 过滤器依赖Servlet容器,拦截器独立。 3. 拦截器作用于Action请求,过滤器作用范围更广。 4. 拦截器可以访问Action上...

    自己实现struts

    在`myStruts1`项目中,你可能已经实现了这些核心组件,并通过编写自定义的Action、FormBean和XML配置文件来模拟Struts的功能。这将帮助你深入理解Struts的工作原理,为今后使用或优化Struts框架打下坚实的基础。此外...

    Struts中等同于DispatchAction类方法

    Struts框架是Java Web开发中一个非常重要的MVC(Model-View-Controller)...尽管这种方法在某些场景下是有效的,但随着Struts框架的发展,现在有更好的实践方式来实现相同的功能,比如使用Struts 2的注解和拦截器机制。

    2017年尚学堂Java培训课程大纲.docx

    - **Struts2拦截器**:学习拦截器的概念及其在Struts2中的应用。 - **文件上传和下载**:实现文件上传和下载功能。 - **Struts2多模块配置**:掌握多模块项目的配置方法。 - **Struts2标签库及OGNL表达式**:学习...

    10小时准备java程序员面试(送给临时抱佛脚的新人).pdf,这是一份不错的文件

    2. **Struts**:Struts作为MVC框架,需要理解其在模型-视图-控制器架构中的角色,以及提供的工具和拦截器等机制。 3. **Tomcat**:掌握Tomcat服务器的基本使用,包括项目的部署方法,了解在非IDE环境下如何操作...

    cglib-nodep-2.1_3.jar

    CGlib全称是Code Generation Library,它是一个强大的代码生成库,广泛应用于动态代理和元编程场景。在Java中,当我们需要在运行时创建对象的代理以实现某些功能,比如方法拦截或者性能监控时,CGlib就派上了用场。...

    java面试学习资料.zip

    Struts的Action、配置文件、拦截器机制;MyBatis的动态SQL、Mapper接口和XML配置文件。了解这些框架的原理和应用场景,以及如何解决实际问题,将有助于你在面试中脱颖而出。 关于MySQL,你需要熟悉SQL语法,如DML...

    spring框架学习

    - **struts-spring-plugin.jar的内部实现**:该插件通过拦截器来获取Spring容器中的Action对象,并将其传递给Struts2框架处理。 #### 十、Spring的事务管理 - **声明式事务管理(基于配置方式实现事务控制)**:...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    面试宝典已回答篇.docx

    8. **Struts Filter与拦截器**:Filter基于函数回调,依赖于Servlet容器,适用于所有请求;Interceptor基于Java反射,不依赖容器,只对Action请求起作用,可以访问Action上下文和值栈。 9. **抽象工厂方法与工厂...

    面试宝典已回答篇.pdf

    8. **Struts Filter与拦截器的区别**:Filter基于函数回调,与Servlet容器紧密关联,可处理所有请求,但无法访问Action上下文。Interceptor基于Java反射,不依赖Servlet容器,仅作用于Action请求,能访问Action上...

Global site tag (gtag.js) - Google Analytics