動態代理: 代理類需要實現InvocationHandler接口。
使用場合舉例: 如果需要委托類處理某一業務,那么我們就可以先在代理類中,對客戶的權限、各類信息先做判斷,如果不滿足某一特定條件,則將其攔截下來,不讓其代理。
ServiceProxy.java
package com.ibm.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ServiceProxy implements InvocationHandler {
private Object target;
public ServiceProxy(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
result = method.invoke(target, args);
return result;
}
/**
* @param target
* @return 返回委托類接口的實例對象
*/
public Object getProxyInstance(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
}
ServiceTest.java(測試類)
package com.ibm;
import com.ibm.delegate.Service;
import com.ibm.delegate.ServiceImpl;
import com.ibm.dynamicproxy.ServiceProxy;
public class ServiceTest {
流行線 /**
* @param args
*/
public static void main(String[] args) {
//創建委托類實例,即被代理的類對象
ServiceImpl target = new ServiceImpl();
//創建動態代理類
ServiceProxy proxy = new ServiceProxy(target);
Service service = (Service) proxy.getProxyInstance();
String date = service.queryDate();
System.out.println(date);
int result = service.sub(10, 20);
System.out.println("10-20 = "+result);
}
}
修改兩個方法,做測試:
ServiceImpl.java
public String ownMethod(){
System.out.println("It's my own method");
return "user";
}
ServiceProxy.java
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if(!(target instanceof ServiceImpl)){
System.out.println("不能代理該對象");
return result;
}else if(!((ServiceImpl)target).ownMethod().equals("admin")){
System.out.println("權限不夠");
return result;
}
result = method.invoke(target, args);
return result;
}
posted on 2012-06-27 15:36
墻頭草 閱讀(564)
評論(0) 編輯 收藏