欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 17:33:04
...

根据动态代理的机制,先创建抽象类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即抽象类。

相关标签: struts2 拦截器