<struts2權(quán)威指南>的一個(gè)例子,是用JDK動(dòng)態(tài)代理來實(shí)現(xiàn)攔截器功能。JDK動(dòng)態(tài)代理只能對實(shí)現(xiàn)了接口的實(shí)例來生成代理。
首先一個(gè)接口:
Dog.java
package my;
public interface Dog
{
public void info();
}
實(shí)現(xiàn)接口的一個(gè)實(shí)例(DogImpl.java):
package my;
public class DogImpl implements Dog
{
public void info()
{
System.out.println("我就是我");
}
}
定義一個(gè)攔截DogImpl類的實(shí)例(DogIntercepter.java):
package my;
public class DogIntercepter
{
public void method1()
{
System.out.println("攔截器的方法1");
}
public void method2()
{
System.out.println("攔截器的方法2");
}
}
下面需要一個(gè)實(shí)現(xiàn)InvocationHanlder接口的代理類(ProxyHander.java):
package my;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class ProxyHandler implements InvocationHandler
{
private Object target;
DogIntercepter di = new DogIntercepter();
public Object invoke(Object proxy,Method method,Object[] args)throws Exception
{
Object result = null;
if(method.getName().equals("info"))
{
di.method1();
result = method.invoke(target,args);
di.method2();
}
else{
result = method.invoke(target,args);
}
return result;
}
public void setTarget(Object o)
{
this.target = o;
}
}
代理工廠類(MyProxyFactory.java),用來根據(jù)目標(biāo)對象生成代理對象:
package my;
import java.lang.reflect.Proxy;
public class MyProxyFactory
{
public static Object getProxy(Object object)
{
ProxyHandler handler = new ProxyHandler();
handler.setTarget(object);
return Proxy.newProxyInstance(DogImpl.class.getClassLoader(),object.getClass().getInterfaces(),handler);
}
}
主程序(TestDog.java):
package my;
public class TestDog
{

public static void main(String[] args)
{
Dog targetObject = new DogImpl();
Dog dog = null;
Object proxy = MyProxyFactory.getProxy(targetObject);
if (proxy instanceof Dog)
{
dog = (Dog)proxy;
}
dog.info();
}
}
ok.使用動(dòng)態(tài)代理實(shí)現(xiàn)了攔截器的功能.
首先一個(gè)接口:
Dog.java





實(shí)現(xiàn)接口的一個(gè)實(shí)例(DogImpl.java):








































































