Proxy

/*
 *Proxy:反射的一种表现形式,一般用于添加辅助功能。此处列举了静态代理和动态代理的简单实例。
 */

package classfile;

import java.lang.reflect.*;
import java.util.*;

public class ProxyDemo
{
	public static void main(String[] args)
	{
		method_StaticProxy();
		method_DynamicProxy();
	}

	//静态代理
	private static void method_StaticProxy()
	{
		//获取代理对象的类文件
		Class clazzProxy = null;
		try
		{
			clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
		}
		catch (IllegalArgumentException e)
		{
			e.printStackTrace();
		}
		
		//获取该类文件的构造方法
		Constructor constructor = null;
		try
		{
			constructor = clazzProxy.getConstructor(InvocationHandler.class);
		}
		catch (NoSuchMethodException | SecurityException e)
		{
			e.printStackTrace();
		}
		
		//创建代理对象
		Collection collection = null;

		//创建被代理的对象
		Collection target = new ArrayList();
		try
		{
			collection = (Collection)constructor.newInstance(new InvocationHandler(){
				public Object invoke(Object object,Method method,Object[] args)throws Throwable
				{
					Object returnValue = null;
					try
					{
						long startTime = System.currentTimeMillis();
						returnValue = method.invoke(target,args);
						System.out.println("方法运行时间为:"+(System.currentTimeMillis()-startTime));
					}
					catch (Exception e)
					{
						e.printStackTrace();
					}
					return returnValue;//此处可以对returnValue的值进行修正,代理的一个特性
				}
			});
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		
		//测试代理的效果
		collection.add("a");
		collection.add("b");
		collection.add("c");
		System.out.println("集合的长度为:"+collection.size());
		System.out.println("集合的内容为:"+collection);
	}

	//动态代理
	private static void method_DynamicProxy()
	{
		DynamicProxyFunctionParter objFunction = new DynamicProxyFunctionParter();

		DynamicProxyTargetInterface obj = (DynamicProxyTargetInterface)method_DynamicProxyCode(new DynamicProxyTargetParter(),objFunction);
		
		obj.runCode();

		System.out.println("代码运行时间为:"+objFunction.getRuntime());
	}

	private static Object method_DynamicProxyCode(Object objectTarget,DynamicProxyFunctionParter objectFunction)
	{
		Object objectProxy = null;

		try
		{
			objectProxy = Proxy.newProxyInstance(
			objectTarget.getClass().getClassLoader(),
			objectTarget.getClass().getInterfaces(),
			new InvocationHandler(){
				public Object invoke(Object object,Method method,Object[] args)throws Throwable
				{
					objectFunction.before();
					Object returnValue = method.invoke(objectTarget,args);
					objectFunction.after();

					return returnValue;
				}
			});
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		
		return objectProxy;
	}

	
}

//被代理的对象必须实现了至少一个接口
interface DynamicProxyTargetInterface
{
	public abstract void runCode();
}

class DynamicProxyTargetParter implements DynamicProxyTargetInterface
{
	public void runCode()
	{
		for(int i=0;i<10;i++)
		{
			try
			{
				Thread.sleep(300);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
}

class DynamicProxyFunctionParter
{
	private long runtime;
	private long startTime;
	private long endTime;

	public long getRuntime()
	{
		return runtime;
	}

	public void before()
	{
		startTime = System.currentTimeMillis();
	}

	public void after()
	{
		endTime = System.currentTimeMillis();
		runtime = endTime - startTime;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值