動態(tài)代理: 代理類需要實(shí)現(xiàn)InvocationHandler接口。
使用場合舉例: 如果需要委托類處理某一業(yè)務(wù),那么我們就可以先在代理類中,對客戶的權(quán)限、各類信息先做判斷,如果不滿足某一特定條件,則將其攔截下來,不讓其代理。
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 返回委托類接口的實(shí)例對象
*/
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) {
//創(chuàng)建委托類實(shí)例,即被代理的類對象
ServiceImpl target = new ServiceImpl();
//創(chuàng)建動態(tài)代理類
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("權(quán)限不夠");
return result;
}
result = method.invoke(target, args);
return result;
}