Java Proxy

来源:互联网 发布:保健品网络销售好做吗 编辑:程序博客网 时间:2024/06/05 12:45

接口(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;    }}


0 0
原创粉丝点击