<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 14, 文章 - 39, 評論 - 17, 引用 - 0
    數(shù)據(jù)加載中……

    JAVA的反射 (轉(zhuǎn))

    JAVA的反射庫提供了一個非常豐富且精心設(shè)計的工具集,以便編寫能夠動態(tài)操縱JAVA代碼的程序,這項功能被大量的應(yīng)用在JavaBeans中,他是JAVA的組建體系結(jié)構(gòu)。

    JAVA中的代理可以在運(yùn)行時創(chuàng)建一個實現(xiàn)一組接口的新類,這種功能只有在編譯時無法確定需要實現(xiàn)哪個接口時才有必要使用,對于應(yīng)用程序設(shè)計人員來說,遇到這種情況的機(jī)會很少。然而對于系統(tǒng)程序設(shè)計人員來說,代理帶來的靈活性卻十分重要。??????????????????????????????????????????????????????????? ? ---摘自《JAVA核心技術(shù)卷2》

    有一些初學(xué)者對反射和代理有一點(diǎn)害怕,覺得這是高深的技術(shù),不敢去碰,其實任何東西都沒有那么復(fù)雜,只要你去接觸,就會有收獲,這篇文章主要講解了反射和代理、AOP方面的知識,但是非?;?,如果有朋友不太明白可以發(fā)表評論,我會認(rèn)真的解答的,下面我貼上兩個程序的代碼,很簡單大家看一下。

    --------------------------------------------------

    /**
    ?*這個程序的功能是通過反射技術(shù)得到一個類(SrcClass)的兩個String類型的成員變量
    ?*然后經(jīng)過判斷對字符串進(jìn)行處理
    ?*這個題目的特點(diǎn):通過對API的閱讀了解Class類的使用方法
    ?*1、getDeclaredFields()得到所有的成員變量
    ?*2、Field類中的一些方法getType()
    ?*3、Field類繼承于AccessibleObject類,有一個setAccessible()方法,查看API得到他的用途
    ?**/
    import java.lang.reflect.Field;
    class SrcClass
    {
    ?private String name = "BeiJing.2008";//定義來兩個String類型的變量,訪問修飾都是私有的
    ?private String eMail = "BeiJing.2008@163.com";
    ?private int age = 25;
    ?
    ?
    ?public String toString()//覆蓋父類的toString方法,打印數(shù)據(jù)
    ?{
    ??return "Name:[ " + this.name + " ] EMail: [ " + this.eMail + " ] Age: [ " + this.age + " ]";
    ?}
    }

    public class TestClass
    {


    ?public static void main(String[] args)
    ?{
    ??SrcClass srcclass = new SrcClass();//首先實例化一個SrcClass類的實例,用于給amendString方法傳值
    ??TestClass testclass = new TestClass();//再實力化一個TestClass的實例
    ??
    ??System.out.println(srcclass);//打印一遍原始信息

    ??
    ??testclass.amendString(srcclass);//調(diào)用amendString方法
    ??System.out.println(srcclass);//打印一遍修改后的信息

    ?}
    ?
    ?
    ?public void amendString(Object cls)//用于修改通過代理得到srcclass的String成員變量,進(jìn)行替換處理
    ?{
    ??try
    ??{
    ???Field[] fidles = cls.getClass().getDeclaredFields();//得到srcclass.getClass()類中的所有成員變量
    ???for(Field field : fidles)//增強(qiáng)for循環(huán)
    ???{
    ????if(field.getType().equals(java.lang.String.class))//判斷這個成員變量的類型是不是String類型的
    ????{???????????????????????????????????????????????? //如果返回true就進(jìn)行處理
    ?????field.setAccessible(true);//設(shè)置這個變量不進(jìn)行訪問權(quán)限檢查(我在SrcClass里設(shè)置的變量為private)
    ?????String newString = (String)field.get(cls);//通過Field類的get方法得到String成員變量
    ?????
    ?????field.set(cls,newString.replaceAll("BeiJing","China"));//進(jìn)行替換,再調(diào)用Field類的set方法進(jìn)行修改
    ????}
    ???}
    ??}
    ??
    ??catch(SecurityException e)//
    ??{
    ???e.printStackTrace();
    ??}
    ??
    ??catch (IllegalArgumentException e)
    ??{
    ???
    ???e.printStackTrace();
    ??}
    ??
    ??catch (IllegalAccessException e)
    ??{
    ???
    ???e.printStackTrace();
    ??}
    ??catch(Exception e)
    ??{
    ???e.printStackTrace();
    ??}
    ?}

    }

    ------------------------------------------------

    下面就是代理了,實現(xiàn)代理必須有4個類(一個接口3各類)

    public interface FooInterface {
    ??? public String printMassage();
    }

    ---------------------------------------------

    class ImplementFoo implements FooInterface {
    ????
    ????? public String printMassage()
    ??? {
    ?????????????? return "This is ImplementFoo ...";
    ??? }
    }

    ?

    ---------------------------------------------

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.util.Date;

    class ImplementInvocationHandler implements InvocationHandler
    {
    ??? private Object foo;

    ??? public ImplementInvocationHandler(Object foo) //獲得將要運(yùn)行類的實際對象
    ??? {
    ?????? this.foo = foo;???
    ??? }

    ??? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable //
    ??? {
    ??????? System.out.println("You want use " + proxy.getClass().getName() + "." +?

    ??????????????????????????????????????????method.getName() + " at " + new Date());
    ??????? return?? method.invoke(foo);//方法調(diào)用
    ??? }
    ???
    }

    ---------------------------------------------

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Proxy;
    /**
    ?*?? InvocationHandler handler = new MyInvocationHandler(...);
    ???? Class proxyClass = Proxy.getProxyClass(
    ???????? Foo.class.getClassLoader(), new Class[] { Foo.class });
    ???? Foo f = (Foo) proxyClass.
    ???????? getConstructor(new Class[] { InvocationHandler.class }).
    ???????? newInstance(new Object[] { handler });

    ?*
    ?*/
    public class TestProxy {
    ???
    ?
    ??? public static void main(String[] args)
    ??? {
    ??????? ImplementFoo foo = new ImplementFoo();//實例化一個實現(xiàn)了FooInterface(自己定義的)接口的類
    ??????? InvocationHandler handler = new ImplementInvocationHandler(foo);
    ??????? //自己編寫實現(xiàn)InvocationHandler接口的類
    ??????? //并且將他實例化,ImplementInvocationHandler類中有一個構(gòu)造函數(shù)需要接受一個ImplementFoo類的對象,? 因為我們將來
    ??????? //要使用ImplementFoo.printMassage方法,ImplementInvocationHandler類方法invoke中的method.invoke(foo)
    ??????? //需要知道他將調(diào)用誰的printMassage方法,所以我們要給ImplementInvocationHandler類傳遞一個ImplementFoo類的對象
    ???????
    ???????? Class proxyClass = Proxy.getProxyClass(FooInterface.class.getClassLoader(),FooInterface.class);
    ??????? //此時我們就要制造出一個代理類了,使用Proxy類的靜態(tài)方法getProxyClass,查看API得到答案
    ???????
    ????????? FooInterface f;
    ??????? try
    ??????? {
    ??????
    ??????????? f =? (FooInterface) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).newInstance(handler);
    ??????????? System.out.println(f.hashCode());//動態(tài)實例化出一個代理類,并且調(diào)用他的hashCode、printMassage方法
    ??????????? System.out.println(f.printMassage());
    ??????????
    ??????? } catch (SecurityException ex) {
    ??????????? ex.printStackTrace();
    ??????? } catch (IllegalArgumentException ex) {
    ??????????? ex.printStackTrace();
    ??????? } catch (IllegalAccessException ex) {
    ??????????? ex.printStackTrace();
    ??????? } catch (InstantiationException ex) {
    ??????????? ex.printStackTrace();
    ??????? } catch (NoSuchMethodException ex) {
    ??????????? ex.printStackTrace();
    ??????? } catch (InvocationTargetException ex) {
    ??????????? ex.printStackTrace();
    ??????? }
    ?
    ??? }
    ???
    }



    posted on 2006-09-29 11:56 mlw2000 閱讀(239) 評論(0)  編輯  收藏 所屬分類: java

    主站蜘蛛池模板: 国产免费女女脚奴视频网| 亚洲欧美日韩中文无线码| 91视频免费观看| 免费a级毛片无码av| 美女裸免费观看网站| 免费看男女下面日出水视频 | 无码天堂va亚洲va在线va| 免费看国产精品3a黄的视频| 亚洲综合中文字幕无线码| 一二三四影视在线看片免费| 亚洲午夜无码久久| 国产一级理论免费版| 青青青视频免费观看| 亚洲精品自产拍在线观看| 三级黄色在线免费观看| 国产日韩亚洲大尺度高清| 91丁香亚洲综合社区| 免费无码午夜福利片| 色妞www精品视频免费看| 久久久久久久国产免费看| 亚洲国产精品人人做人人爱| 色老板亚洲视频免在线观| 成年女人喷潮毛片免费播放| 狠狠入ady亚洲精品| 国产成人高清精品免费鸭子| 亚洲综合日韩中文字幕v在线 | 7723日本高清完整版免费| 最新国产精品亚洲| 亚洲AV无码一区二区三区国产| 日韩电影免费在线观看网址| 国产亚洲AV手机在线观看| 30岁的女人韩剧免费观看| 亚洲精品成a人在线观看夫| 免费A级毛片无码A| 成全在线观看免费观看大全| 亚洲人成在线精品| 四虎永久在线精品视频免费观看| 成全视频高清免费观看电视剧| 日韩亚洲不卡在线视频中文字幕在线观看 | 亚洲日本久久一区二区va| 九月婷婷亚洲综合在线|