并可以计算每个方法运行的时间。
// 代理类
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 ProxyDemo1 {
public static void main(String[] args) throws Exception
{
Class clazz =Proxy.getProxyClass
(Collection.class.getClassLoader(),Collection.class);
System.out.println(clazz.getName());
//获得Proxy 的构造方法。
Constructor[] constructors = clazz.getConstructors();
for(Constructor constructor: constructors)
{
String name=constructor.getName();
StringBuilder sBuilder = new StringBuilder(name);
sBuilder.append('(');
Class [] clazzParams = constructor.getParameterTypes();
for(Class clazzParam: clazzParams)
{
sBuilder.append(clazzParam.getName()).append(',');
}
if(clazzParams!=null&&clazzParams.length!=0)
sBuilder.deleteCharAt(sBuilder.length()-1);
sBuilder.append(')');
System.out.println(sBuilder.toString()+"---------");//看看方法名字。
}
// 给我一个目标,给我一个系统功能,我就返回一个代理,那代理就会调用目标对象,并且目标对象会执行系统功能。
final ArrayList target =new ArrayList();
Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
// 每调用一次add 都会调用一次InvocationHandler的invoke方法,代理对象,代理对象的方法,代理对象的方法参数这三要素传递给invoke。
proxy3.add("zxx");
proxy3.add("bxd");
proxy3.add("lhm");
System.out.println(proxy3.size());
}
//不仅要对集合进行,对其他对象都能封装。将集合换成任意对象。即将目标和系统功能都封装成对象。
private static Object getProxy(final Object target,final Advice advice) //内部类成员访问局部变量 需要final。
{
Object proxy3 = Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 将目标抽取成一个对象。
//new Class[]{Collection.class},
target.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
advice.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
return retVal;
}
});
return proxy3;
}
}
// 目标功能类
import java.lang.reflect.Method;
public class MyAdvice implements Advice{
long beginTime =0;
public void beforeMethod(Method method) {
System.out.println("方法前");
beginTime =System.currentTimeMillis();
System.out.println(method.getName());
}
public void afterMethod(Method method) {
System.out.println("方法后 ");
long endTime2 =System.currentTimeMillis();
System.out.println(method.getName()+":运行时间:"+(endTime2-beginTime));
}
}
// Advice 接口
import java.lang.reflect.Method;
// 系统功能类名,也是忠告。
public interface Advice {
void beforeMethod (Method method);
void afterMethod (Method method);
}