java 代理二三事

来源:互联网 发布:免费mv制作软件 编辑:程序博客网 时间:2024/06/14 03:19

好了,图片看的也差不多了,让我们上手写一个小程序吧!

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;}@Overridepublic 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.等


1 0