1. 程式人生 > 實用技巧 >java基礎-01代理類

java基礎-01代理類

簡單的代理類實現案例
主實現類:ProxyTest
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Random;
//為什麼需要代理類?因為在實際情況下,我們要構建實現了某些介面的新類,但是我們不知道原始的物件確切型別是什麼,另外介面又不能生成例項,有兩種解決辦法:
//方法一:通過反射,找到這個類的構造器,但是不能例項化一個介面,因此需要在程式執行時動態地定義一個新類
//方法二:建立代理物件(代理物件只有一個例項域:handler 這個物件包裝了實際的物件,也就是使被包裝的物件是實現介面的功能)
public class ProxyTest {
public static void main(String[] args) {
Object[] elements = new Object[10];
for(int i=0;i< elements.length;i++){
Integer value = i+1;
InvocationHandler handler = new TraceHandler(value);
// 構造一個代理例項(引數1 類載入器;引數2 介面類物件陣列;引數3 呼叫處理器)
Object proxy = Proxy.newProxyInstance(null,new Class[]{Comparable.class},handler);
elements[i] = proxy;
}
//構造一個隨機數
Integer key = new Random().nextInt(elements.length)+1;
//尋找key
int result = Arrays.binarySearch(elements,key);
//如果找到了就打印出來
if(result>=0) System.out.println(elements[result]);
}
}

輔助類:TraceHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TraceHandler implements InvocationHandler {
private Object target;
public TraceHandler(Object t){
target = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.print(target);
System.out.print("."+method.getName()+"(");
if(args!=null){
for(int i=0;i< args.length;i++){
System.out.print(args[i]);
if(i< args.length-1) System.out.print(", ");
}
}
System.out.println(")");
return method.invoke(target,args);
}
}
參考:java基礎技術卷1