/*
*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;
}
}
Proxy
最新推荐文章于 2023-03-20 19:57:45 发布