Java Proxy

接口(Advice):

package com.mth.Proxy;

import java.lang.reflect.Method;

public interface Advice {
    void beforMethod(Method method);

    void afterMethod(Method method);
}

实现类:

package com.mth.Proxy;

import java.lang.reflect.Method;

public class AdviceImpl implements Advice {

    private long begin;
    
    @Override
    public void afterMethod(Method method) {
	long end = System.currentTimeMillis();
	System.out.println(method.getName()+"方法运行时间       "+(begin - end));
	System.out.println("after结束啦!");

    }

    @Override
    public void beforMethod(Method method) {
	System.out.println("before开始啦!");
	begin = System.currentTimeMillis();
    }

}

代理:


package com.mth.Proxy;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class ProxyTest {

    public static void main(String[] args) throws Exception {
	System.out.println("=============获取构造方法=================");
	Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(),
		Collection.class);
	Constructor[] constructors = clazz.getConstructors();
	for (Constructor constructor : constructors) {
	    String name = constructor.getName();
	    StringBuilder sb = new StringBuilder(name);
	    sb.append("(");
	    Class[] classes = constructor.getParameterTypes();
	    for (int i = 0; i < classes.length; i++) {
		sb.append(classes[i].getName());
		sb.append(",");
	    }
	    if (classes != null && classes.length != 0) {
		sb.deleteCharAt(sb.length() - 1);
	    }
	    sb.append(")");
	    // $Proxy0(java.lang.reflect.InvocationHandler)
	    System.out.println(sb);
	}

	System.out.println("==============获取函数===================");

	Method[] Methods = clazz.getMethods();
	for (Method Method : Methods) {
	    String name = Method.getName();
	    StringBuilder sb = new StringBuilder(name);
	    sb.append("(");
	    Class[] classes = Method.getParameterTypes();
	    for (int i = 0; i < classes.length; i++) {
		sb.append(classes[i].getName());
		sb.append(",");
	    }
	    if (classes != null && classes.length != 0) {
		sb.deleteCharAt(sb.length() - 1);
	    }
	    sb.append(")");
	    // $Proxy0(java.lang.reflect.InvocationHandler)
	    System.out.println(sb);
	}

	System.out.println("==============通过构造创建实例对象===================");
	// 不能使用clazz.newInstance() 因为没有不带参数的构造方法
	// Constructor con2=clazz.getConstructors()[0];
	Constructor con = clazz.getConstructor(InvocationHandler.class);
	// 调用构造方法创建实例
	Collection proxy1 = (Collection) con
		.newInstance(new InvocationHandler() {

		    @Override
		    public Object invoke(Object proxy, Method method,
			    Object[] args) throws Throwable {
			return null;
		    }
		});
	/**
	 * 打印结果是null 两种可能:一种是toString 返回方法是null ;二种是 创建失败为对象null
	 * 
	 * 结果是toString 是null 因为proxy1.clear()不报空指针异常
	 */
	System.out.println(proxy1);

	System.out.println("=================一步到位创建=====================");

	Collection proxy3=(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),
		new Class[] {}, new InvocationHandler() {
	    		
		    ArrayList target = new ArrayList();

		    @Override
		    public Object invoke(Object proxy, Method method,
			    Object[] args) throws Throwable {

			return method.invoke(target, args);
		    }
		});

	System.out.println("=================通用方法获取代理=====================");

	// 目标
	final ArrayList target = new ArrayList();
	//定义功能对象
	Advice advice = new AdviceImpl();
	Collection proxy2 = (Collection) getProxy(target, advice);
	proxy2.add("abc");
	proxy2.add("sss");
	proxy2.add("vvv");
	System.out.println(proxy2.size());

	// 下面这句话为什么没有调用invoke方法呢?
	/**
	 * 因为Object上面的 hashCode equals toString交给Handler 其他方法都不交给Handler
	 */
	// System.out.println(proxy2.getClass().getName());
    }

    // 通用方法
    private static Object getProxy(final Object target, final Advice advice) {
	Object proxy2 = Proxy.newProxyInstance(target.getClass()
		.getClassLoader(),
	// new Class[] { Collection.class },
		target.getClass().getInterfaces(), new InvocationHandler() {

		    // 代理对象 代理对象那个方法 代理对象方法的参数
		    // proxy2 方法add 参数"abc"
		    @Override
		    public Object invoke(Object proxy, Method method,
			    Object[] args) throws Throwable {
			// long begin = System.currentTimeMillis();
			// Object retVal = method.invoke(target, args);
			// long end = System.currentTimeMillis();
			// System.out.println(method.getName() + "   "
			// + (begin - end));
			// return retVal;

			advice.beforMethod(method);
			Object retVal = method.invoke(target, args);
			advice.afterMethod(method);
			return retVal;

			/**
			 * 下面这句话的意思是:在目标对象上面执行代理在执行的方法 ;传递给代理的参数,继续传递给目标。
			 */
			// return method.invoke(target, args);
		    }
		});
	return proxy2;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值