java 代理二三事

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

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.等


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值