Java基礎(chǔ)之代理
代理
創(chuàng)建代理對(duì)象
要想創(chuàng)建一個(gè)代理對(duì)象,需要使用Proxy類的newProxyInstance方法。這個(gè)方法有三個(gè)參數(shù):
1. 一個(gè)類加載器,作為Java安全模型的一部分,對(duì)于系統(tǒng)類和從因特網(wǎng)上下載下來的類,可以使用
不同的類加載器。
2. 一個(gè)Class對(duì)象數(shù)組,每個(gè)元素都是需要實(shí)現(xiàn)的接口
3. 一個(gè)調(diào)用處理器。
使用代理可能出于很多原因,例如:
1. 路由對(duì)遠(yuǎn)程服務(wù)器的方法調(diào)用。
2. 在程序運(yùn)行期間,將用戶接口事件與動(dòng)作關(guān)聯(lián)起來。
3. 為調(diào)試,跟蹤方法調(diào)用。
public class ProxyTest {
public static void main(String[] args) {
Object[] elements = new Object[1000];
for (int i = 0; i < elements.length; i++) {
Integer value = i + 1;
TraceHandler traceHandler = new TraceHandler(value);
Object proxy = Proxy.newProxyInstance(null, new Class[]{Comparable.class}, traceHandler);
elements[i] = proxy;
Integer key = new Random().nextInt(elements.length) - 1;
int result = Arrays.binarySearch(elements, key);
if (result >= 0) {
System.out.println(elements[result]);
}
}
}
}
class TraceHandler implements InvocationHandler {
private Object target;
public TraceHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(target);
System.out.println("." + method.getName() + "(");
if (args != null) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
if (i < args.length - 1) {
System.out.println(",");
}
}
System.out.println(")");
}
return method.invoke(target, args);
}
}
代理類的特性
代理類是在程序運(yùn)行過程中創(chuàng)建的。然而,一旦被創(chuàng)建,就變成了常規(guī)類,與虛擬機(jī)中的任何其他類沒有什么區(qū)別。
所有的代理類都擴(kuò)展于Proxy類。一個(gè)代理類只有一個(gè)實(shí)例域—–調(diào)用處理器。它定義在Proxy的超類中。
作者:碼農(nóng)飛哥
微信公眾號(hào):碼農(nóng)飛哥