package cn.itcast.proxy; public class Test { public static void main(String[] args) { Subject subject = new ProxyRealSubject(); subject.action(); } }
//接口 interface Subject { void action(); }
//被代理类
class RealSubject implements Subject { @Override public void action() { System.out.println("------------"); System.out.println("------------"); System.out.println("这是被代理的类"); System.out.println("------------"); System.out.println("------------"); } }
package com.itheima; 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 Test4 { /** * 4、 写一个ArrayList类的代理,实现和ArrayList中完全相同的功能, 并可以计算每个方法运行的时间。 * * 思路: * 1.写一个获得代理类的通用方法: * public static Object getProxy(final Object target, final Advice advice){} * target是被代理的类,Advice是需要插入系统中的功能接口。 * * 2.定义一个接口Advice,为插入的系统功能定义规则interface Advice{} * * 3. 实现Advice接口,实现具体的系统功能,即:计算每个方法运行的时间。 * class MyAdvice implements Advice{实现方法} * * @author 鲁中需 */ public static void main(String[] args) { // 获取ArrayList的代理 final ArrayList list = new ArrayList(); Collection proxy = (Collection) getProxy(list, new MyAdvice()); // 演示效果: proxy.add("flx"); proxy.add("bxd"); proxy.add("zxx"); proxy.add("lxz"); System.out.println(list.size()); } // 获得代理类的通用方法: public static Object getProxy(final Object target, final Advice advice) { Object proxy = Proxy.newProxyInstance(target.getClass() .getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在调用方法前,调用beforeMethod(Method method) advice.beforeMethod(method); Thread.sleep(1000); Object retVal = method.invoke(target, args); // 在调用方法后,调用afterMethod(Method method) advice.afterMethod(method); return retVal; } }); return proxy; } } // 定义一个接口Advice,为插入的系统功能定义规则 interface Advice { public abstract void beforeMethod(Method method); public abstract void afterMethod(Method method); } // 实现Advice接口,实现具体的系统功能,即:计算每个方法运行的时间。 class MyAdvice implements Advice { long beginTime = 0; @Override public void beforeMethod(Method method) { System.out.println("调用方法前的功能"); beginTime = System.currentTimeMillis(); } @Override public void afterMethod(Method method) { System.out.println("调用方法后的功能"); long costTime = System.currentTimeMillis() - beginTime; System.out.println("方法:" + method + " running time of " + costTime + "毫秒!"); } }