zoukankan      html  css  js  c++  java
  • 方法对象代理代码详解!!!

    PS:今天上午,非常郁闷,有很多简单础基的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        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
    //回返代理类(此处代理类为Collection)的Class 对象
    Class clazzProxy1=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
    System.out.println(clazzProxy1.getName());
    //打印出构造函数
    System.out.println("---------------begin constractor list------------");
    Constructor[] constructors=clazzProxy1.getConstructors();
    for(Constructor constructor:constructors){
    String name=constructor.getName();
    StringBuilder sBuilder=new StringBuilder(name);
    sBuilder.append('(');
    //获得构造函数参数类型
    Class[] clazzparms=constructor.getParameterTypes();
    for(Class clazzParm:clazzparms){
    sBuilder.append(clazzParm.getName()).append(',');
    }

    if(clazzparms.length!=0 && clazzparms!=null)
    //将最后一个','去掉
    sBuilder.deleteCharAt(sBuilder.length()-1);

    sBuilder.append(')');

    System.out.println(sBuilder.toString());
    }
    //打印出一般函数
    System.out.println("---------------begin methods list------------");
    Method[] methods=clazzProxy1.getMethods();
    for(Method method:methods){
    String name=method.getName();
    StringBuilder sBuilder=new StringBuilder(name);
    sBuilder.append('(');
    Class[] clazzparms=method.getParameterTypes();
    for(Class clazzParm:clazzparms){
    sBuilder.append(clazzParm.getName()).append(',');
    }

    if(clazzparms.length!=0 && clazzparms!=null)
    //将最后一个','去掉
    sBuilder.deleteCharAt(sBuilder.length()-1);

    sBuilder.append(')');

    System.out.println(sBuilder.toString());

    }
    System.out.println("---------------begin creat instance------------");
    //获得构造函数
    Constructor constructor=clazzProxy1.getConstructor(InvocationHandler.class);

    class MyInvocationHandler1 implements InvocationHandler{


    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    // TODO Auto-generated method stub
    return null;
    }

    }
    //动态方法回返一个实例对象
    Collection proxy1=(Collection)constructor.newInstance(new MyInvocationHandler1());
    //用匿名内部类建创一个实例对象
    Collection proxy2=(Collection)constructor.newInstance(new InvocationHandler(){
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    // TODO Auto-generated method stub
    return null;
    }
    });
    //直接用此方法建创一个对象
    Collection proxy3=(Collection)Proxy.newProxyInstance(

    Collection.class.getClassLoader(),

    new Class[]{Collection.class},

    new InvocationHandler(){
    ArrayList target=new ArrayList();
    //参数的义意: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;
    }
    });
    //每调用一次恣意方法都市找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());

    }

        每日一道理
    试试看——不是像企鹅那样静静的站在海边,翘首企盼机会的来临,而是如苍鹰一般不停的翻飞盘旋,执著的寻求。 试试看——不是面对峰回路转、杂草丛生的前途枉自嗟叹,而是披荆斩棘,举步探索。 试试看——不是拘泥于命运的禁锢,听凭命运的摆布,而是奋力敲击其神秘的门扉,使之洞开一个新的天地。微笑着,去唱生活的歌谣。

        }

        

        

        

        

        分享一下我的习学料资!!!!
    Java全套顶级频视
    http://pro.net.itcast.cn/View-22-1435.aspx
    DotNet全套频视
    http://pro.net.itcast.cn/View-23-1435.aspx
    PHP全套频视
    http://pro.net.itcast.cn/View-24-1435.aspx
    全球最适合0础基习学程编的网上校园
    http://pro.net.itcast.cn/View-25-1435.aspx
    费免请求java全套频视光盘区域
    http://pro.net.itcast.cn/View-26-1435.aspx

    文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
    “如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
    “如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
    “如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
    “如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
      最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

  • 相关阅读:
    最近公共祖先
    洛谷 P1076 寻宝 解题报告
    洛谷 P1121 环状最大两段子段和 解题报告
    洛谷 P3705 [SDOI2017]新生舞会 解题报告
    洛谷 P1381 单词背诵 解题报告
    洛谷 P3155 [CQOI2009]叶子的染色 解题报告
    洛谷 P3237 [HNOI2014]米特运输 解题报告
    洛谷 P2345 奶牛集会 解题报告
    洛谷 P1582 倒水 解题报告
    数论知识荟萃
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3049931.html
Copyright © 2011-2022 走看看