<struts2權威指南>的一個例子,是用JDK動態代理來實現攔截器功能。JDK動態代理只能對實現了接口的實例來生成代理。
首先一個接口:
Dog.java
package my;
public interface Dog
{
public void info();
}
實現接口的一個實例(DogImpl.java):
package my;
public class DogImpl implements Dog
{
public void info()
{
System.out.println("我就是我");
}
}
定義一個攔截DogImpl類的實例(DogIntercepter.java):
package my;
public class DogIntercepter
{
public void method1()
{
System.out.println("攔截器的方法1");
}
public void method2()
{
System.out.println("攔截器的方法2");
}
}
下面需要一個實現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),用來根據目標對象生成代理對象:
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.使用動態代理實現了攔截器的功能.
首先一個接口:
Dog.java





實現接口的一個實例(DogImpl.java):








































































