好了,图片看的也差不多了,让我们上手写一个小程序吧!
package com.heima.proxy;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class TestProxy {
public static void main(String[] args) {
Object[] b = new Object[10];
for (int i = 0; i < b.length; i++) {
Integer e = i;
TraceHandler traceHandler = new TraceHandler(i);
Object integerProxy = Proxy.newProxyInstance(null,new Class[] {Comparable.class},traceHandler);
/*该函数的文档说明:public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。*/
b[i] = integerProxy;
}
System.out.println(Arrays.binarySearch(b, 5));
}
}
package com.heima.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
*该类必须实现InvocationHandler接口,该接口只有一个方法:
*public Object invoke(Object proxy, Method method, Object[] args)throws Throwable
*/
public class TraceHandler implements InvocationHandler {
Integer i;
public TraceHandler(Integer i) {
super();
this.i = i;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
StringBuffer sb =new StringBuffer();
sb.append(i);
sb.append(".");
sb.append(method.getName());
sb.append("(");
for (int i = 0; i < args.length; i++) {
sb.append(args[i]);
if(i < args.length - 1) sb.append(",");
}
sb.append(")");
System.out.println(sb.toString());
return method.invoke(i,args);
}
}
有哥们会问我也没有调用代理对象的方法a ,看Arrays.binarySearch(b, 5);这段函数的源码我们会知道,Arrays.binarySearch是利用参数对象的compareto()方法来一较高下的,所以呢~~!好了来看一下Arrays.binarySearch()的源码:
private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
Object key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
@SuppressWarnings("rawtypes")
Comparable midVal = (Comparable)a[mid];
@SuppressWarnings("unchecked")
int cmp = midVal.compareTo(key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
本篇文章涉及到了StringBuffer类的一些知识和反射的知识,不明白的可以看一下帮助文档来学习StringBuffer类,反射可以参看Class类 Field类,Method类,和Constructor类。
那么代理这摸麻烦到底有什么作用呢??
1.路由对远程服务器方法的调用
2.在程序运行期间,将用户接口事件与动作联系起来
3.为跟踪,调试方法调用
4.等