方法调用代理代码改进

近期一直在学习方法调用之类的问题,下午正好有机会和大家讨论一下.

    package cn.itcast.day3;

    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 ProxtTest {

    /**

    * @param args

    */

    public static void main(String[] args)throws Exception {

    // TODO Auto-generated method stub

    final ArrayList target=new ArrayList();

    //直接用newProxyInstance方法创立一个象对

    Collection proxy3 = (Collection )getProxy(target,new MyAdvice());

    //每调用一次意任方法会都找proxy3象对身上Handler的invoke()方法;

    Object obj=proxy3.add("zxx");

    System.out.println(obj);

    proxy3.add("lhm");

    proxy3.add("flx");

    System.out.println(proxy3.size());

    //getClass()为从Object继承的方法,从Object继承的方法中只有

    //调用hashCode(),equals(),toString()这三种方法才转到invoke(),其余的不转

    System.out.println(proxy3.getClass().getName());

    }

    private static Object getProxy(final Object target,final Advice advice) {

    Object proxy3=Proxy.newProxyInstance(

    target.getClass().getClassLoader(),

    /*new Class[]{Collection.class},*/

    target.getClass().getInterfaces(),

    new InvocationHandler(){

    //参数的义意:proxy:理代的象对,method:理代象对调用的方法,args:理代象对调用的方法中传入的参数

    //比如:proxy3.add("zxx");则proxy为proxy3,method为add(),args数组中据数为zxx.

    //invoke()方法返回的参数反给理代象对

    public Object invoke(Object proxy, Method method, Object[] args)

    throws Throwable {

    /*long beginTime=System.currentTimeMillis();

    Object retVal=method.invoke(target, args);

    long endTime=System.currentTimeMillis();

    System.out.println(method.getName()+" running time of "+(endTime-beginTime));

    return retVal;*/

    advice.beforeMethod(method);

    每日一道理
我把卷子摊在课桌上,恨不得敲一阵锣,叫大家都来看看我这光彩的分数。

    Object retVal=method.invoke(target, args);

    advice.afterMethod(method);

    return retVal;

    }

    });

    return proxy3;

    }

    }

    

    package cn.itcast.day3;


import java.lang.reflect.Method;


public interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}

    

    

    package cn.itcast.day3;


import java.lang.reflect.Method;


public class MyAdvice implements Advice {
long beginTime = 0;
public void afterMethod(Method method) {
// TODO Auto-generated method stub
System.out.println("从传智客播结业下班啦!");
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " running time of " + (endTime - beginTime));


}


public void beforeMethod(Method method) {
// TODO Auto-generated method stub
System.out.println("到传智客播来学习啦!");
beginTime = System.currentTimeMillis();
}


}

文章结束给大家分享下程序员的一些笑话语录: 关于编程语言
如果 C++是一把锤子的话,那么编程就会变成大手指头。
如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

posted @ 2013-04-30 17:51  坚固66  阅读(115)  评论(0编辑  收藏  举报