說是struts2的核心就是攔截器
先看看攔截器的實現(xiàn)
實現(xiàn)攔截器有這么幾個東西構(gòu)成
1、目標對象-將被攔截的對象,這個對象中的方法被調(diào)用是將被攔截
要求目標對象面向接口編程,首先要定義接口
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:37:23
* 面向接口編程
* 目標對象的接口
*/
public interface TargetInterface {
public void doSomething();
}
目標對象實現(xiàn)
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:36:26
* 目標對象
*/
public class Target implements TargetInterface{
public void doSomething(){
System.out.println("do something");
}
}
2、攔截器對象-里面包含在調(diào)用目標對象前或后要調(diào)用的方法
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:39:32
* 攔截器
*/
public class Interceptor {
public void before(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
}
3、處理器-處理器決定攔截器如何攔截目標對象
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:41:08
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 處理器
* 在這里將目標對象Target和攔截器Interceptor聯(lián)系在了一起
*/
public class MyHandler implements InvocationHandler{
/**
* 目標對象
* 將來目標對象的方法將被注入interceptor
*/
private Object object;
/**
* 攔截器
* MyHandler負責(zé)將Interceptor這個攔截器注入到傳入的目標對象object
*/
private Interceptor interceptor = new Interceptor();
public void setObject(Object object){
this.object = object;
}
/**
* 實現(xiàn)InvocationHandler接口的方法
* @param o 在其上調(diào)用方法的代理實例
* @param method 對應(yīng)于在代理實例上調(diào)用的接口方法的 Method 實例
* @param objects 包含傳入代理實例上方法調(diào)用的參數(shù)值的對象數(shù)組
* @return 從代理實例的方法調(diào)用返回的值
* @throws Throwable
*/
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Object result = null;
interceptor.before();
result = method.invoke(object,objects);
interceptor.after();
return result;
}
}
4、代理對象-用于得到目標對象的代理對象
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:50:52
* 代理類
*/
import java.lang.reflect.Proxy;
public class MyProxy {
/**
* 返回obj的,處理器為MyHandler的代理對象
* @param obj 目標對象
* @return 目標對象的代理對象
*/
public Object getProxy(Object obj){
MyHandler myHandler = new MyHandler();
myHandler.setObject(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),myHandler);
}
}
5、最后客戶調(diào)用代碼
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:55:45
* 客戶調(diào)用
*/
public class Client {
public static void main(String[] args){
//目標對象
TargetInterface target = new Target();
//代理對象
MyProxy myProxy = new MyProxy();
//通過代理對象得到目標對象的代理
TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
//通過目標對象的代理調(diào)用目標對象的方法
proxy.doSomething();
}
}
//輸出:
//before
//do something
//after
將自己的理解寫了注釋,現(xiàn)在只理解到這個程度,像
Proxy.
newProxyInstance
里面是怎么實現(xiàn)的,還沒深入考究
繼續(xù)努力