zoukankan      html  css  js  c++  java
  • 方法调用代理代码改进

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

        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 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

  • 相关阅读:
    纸牌游戏
    万圣节派对
    士兵杀敌(三)简单线段树
    百度之星2016资格赛之部分题解
    hdu Simpsons’Hidden Talents(kmp)
    滑梯理论
    PAP认证方式原理和实现
    Google的Protobuf协议分析
    HMac基本介绍
    为Tcl编写C的扩展库
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3052162.html
Copyright © 2011-2022 走看看