<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)了攔截器的功能.