<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        java反射機(jī)制及動(dòng)態(tài)代理

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 13:20:22
        文檔

        java反射機(jī)制及動(dòng)態(tài)代理

        java反射機(jī)制及動(dòng)態(tài)代理:目前正在看Hadoop RPC框架的源碼,在深入了解這些之前,有一些基礎(chǔ)知識(shí)需要回顧下。 1. java反射機(jī)制及動(dòng)態(tài)代理 2. java網(wǎng)絡(luò)編程 3. java NIO 先總結(jié)下第一個(gè),java反射機(jī)制及動(dòng)態(tài)代理的相關(guān)知識(shí)點(diǎn): java反射機(jī)制 在看與java反射機(jī)制相關(guān)的代碼前,試著
        推薦度:
        導(dǎo)讀java反射機(jī)制及動(dòng)態(tài)代理:目前正在看Hadoop RPC框架的源碼,在深入了解這些之前,有一些基礎(chǔ)知識(shí)需要回顧下。 1. java反射機(jī)制及動(dòng)態(tài)代理 2. java網(wǎng)絡(luò)編程 3. java NIO 先總結(jié)下第一個(gè),java反射機(jī)制及動(dòng)態(tài)代理的相關(guān)知識(shí)點(diǎn): java反射機(jī)制 在看與java反射機(jī)制相關(guān)的代碼前,試著

        如上面這段代碼,在靜態(tài)語言中,在編譯階段編譯器就會(huì)報(bào)錯(cuò)。而對(duì)于動(dòng)態(tài)語言,是可以修改變量類型的,如下面:

        i = 1
        i = ‘hi’

        1. 先嘗試看看第一個(gè)問題,什么是反射機(jī)制?

        在運(yùn)行時(shí)環(huán)境,動(dòng)態(tài)獲取類的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能,就是reflection機(jī)制。

        2. 哪些地方需要反射?

        * 運(yùn)行時(shí)判斷任何一個(gè)對(duì)象所屬的類
        * 運(yùn)行時(shí)構(gòu)造任何一個(gè)類的對(duì)象
        * 運(yùn)行時(shí)判斷任何一個(gè)類所具有的成員變量和方法
        * 運(yùn)行時(shí)調(diào)用任何一個(gè)對(duì)象的方法

        3. 反射的使用?

        先看看java reflection api, Class類是反射的入口點(diǎn)。有下面3種方式獲取:

        1. Class.forName(“java.util.Data”)
        2. T.getClass()
        3. T.class

        一個(gè)Class對(duì)象實(shí)際表示一個(gè)類型,但這個(gè)類型不一定是一種類。比如說int不表示類,但是int.class是一個(gè)Class類型的對(duì)象。

        注:數(shù)組類型,使用getName會(huì)返回一個(gè)很奇怪的名字,如:

        System.out.println(Double[].class.getName());
        顯示打印的值如下:
        [Ljava.lang.Double;

        創(chuàng)建一個(gè)類的實(shí)例newInstance方法:使用默認(rèn)的構(gòu)造函數(shù),沒有參數(shù)

        T.class.newInstance();
        Object objCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});

        反射分析類的能力:

      1. 1. java.lang.reflect包下面有3個(gè)類,F(xiàn)ield,Method,Constructor,分別用來描述屬性,方法,構(gòu)造函數(shù)
      2. 2. 還有一個(gè)修飾符的獲取,Modifier
      3. 4. 一個(gè)反射的簡(jiǎn)單例子程序:

        package com.lifeware.study.reflection;
        import java.lang.reflect.Field;
        import java.lang.reflect.InvocationTargetException;
        import java.lang.reflect.Method;
        public class ReflectTetser {
        public Object copy(Object obj) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        Class classType = obj.getClass();
        System.out.println(classType.getName());
        Object objCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});

        Field[] fields = classType.getDeclaredFields();
        for(Field field:fields){
        System.out.println(field.getName());
        String firstLetter = field.getName().substring(0,1).toUpperCase();
        String getMethodName = “get” + firstLetter + field.getName().substring(1);
        String setMethodName = “set” + firstLetter + field.getName().substring(1);

        Method getMethod = classType.getMethod(getMethodName, new Class[]{});
        Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});

        Object value = getMethod.invoke(obj, new Object[]{});
        setMethod.invoke(objCopy, new Object[]{value});
        }
        return objCopy;
        }
        /**
        * @param args
        * @throws NoSuchMethodException
        * @throws InvocationTargetException
        * @throws IllegalAccessException
        * @throws InstantiationException
        * @throws SecurityException
        * @throws IllegalArgumentException
        */
        public static void main(String[] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        // TODO Auto-generated method stub
        Customer cus = new Customer();
        cus.setId(new Long(100));
        cus.setAge(new Long(50));
        cus.setName(“zhangsan”);
        Customer cuscopy = (Customer) new ReflectTetser().copy(cus);
        System.out.println(cuscopy.getId() + “,” + cuscopy.getAge() + “,” + cuscopy.getName());
        }
        }
        class Customer{
        private Long id;
        private Long age;
        private String name;

        public Customer(){

        }

        public Long getId(){
        return id;
        }

        public Long getAge(){
        return age;
        }

        public String getName(){
        return name;
        }

        public void setId(Long id){
        this.id = id;
        }

        public void setAge(Long age){
        this.age = age;
        }

        public void setName(String name){
        this.name = name;
        }
        }

        5. 當(dāng)然,反射寫通用的數(shù)組代碼時(shí),還需要用到:java.lang.reflect.Array

        public static Object goodArrayGrow(Object a){
        Class c1 = a.getClass();
        if(!c1.isArray()){
        return null;
        }
        Class componentType = c1.getComponentType();
        int length = Array.getLength(a);
        int newLength = length * 11/10 + 10;
        Object newArray = Array.newInstance(componentType, newLength);
        System.arraycopy(a, 0, newArray, 0, length);

        return newArray;
        }

        動(dòng)態(tài)代理

        動(dòng)態(tài)代理部分:想清楚下面四個(gè)問題

        1.什么是動(dòng)態(tài)代理?
        一種用于轉(zhuǎn)發(fā)請(qǐng)求,進(jìn)行特殊處理的機(jī)制,“動(dòng)態(tài)”應(yīng)該指的是“運(yùn)行期”。
        2.為什么使用動(dòng)態(tài)代理?
        可以對(duì)請(qǐng)求進(jìn)行任何處理(如事務(wù),日志等,這都是網(wǎng)上說的,我當(dāng)然可以做任何處理)
        3.使用它有哪些好處?
        如上
        4.哪些地方需要?jiǎng)討B(tài)代理?
        不允許直接訪問某些類;對(duì)訪問要做特殊處理等,我只能想到這些。

        1. 和動(dòng)態(tài)代理有關(guān)的有兩個(gè)類

        1.1 interface InvocationHandler

        只這一個(gè)方法, Object invoke(Object proxy, Method method, Object[] args)

        1.2 class Proxy 真正表示動(dòng)態(tài)代理的類,提供兩個(gè)靜態(tài)方法:

        Class getProxyClass(ClassLoader loader, Class[] interface)

        用來產(chǎn)生代理類,參數(shù)要提供interface數(shù)組,它會(huì)生成這些interface的“虛擬實(shí)現(xiàn)”,

        用來冒充真實(shí)的對(duì)象。

        Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

        產(chǎn)生代理對(duì)象,多了InvocationHandler參數(shù)(只是InvocationHandler接口的實(shí)現(xiàn)類),

        它與代理對(duì)象關(guān)聯(lián),當(dāng)請(qǐng)求分發(fā)到代理對(duì)象后,會(huì)自動(dòng)執(zhí)行h.invoke(…)方法.

        2. 動(dòng)態(tài)機(jī)制的實(shí)現(xiàn)步驟:

        /**
        * 1. 實(shí)現(xiàn)InvocationHandler接口創(chuàng)建自己的調(diào)用處理器
        * InvocationHandler handler = new InvocationHandlerImpl(server);
        * 2. 通過Proxy指定ClassLoader對(duì)象和一組interface創(chuàng)建動(dòng)態(tài)代理類
        * Class clazz = Proxy.getProxyClass(classLoader,new class[]{…})
        * 3. 通過反射機(jī)制獲取動(dòng)態(tài)代理類的構(gòu)造函數(shù),其參數(shù)類型是調(diào)用處理器接口類型:
        * Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class})
        * 4. 通過構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類實(shí)例,將調(diào)用處理器對(duì)象作為參數(shù)被傳入
        * Interface proxy = constructor.newInstance(new Object[]{handler})
        *
        * Proxy中newProxyInstance方法已經(jīng)封裝了步驟2~4,實(shí)例如下:
        */

        3. 一個(gè)簡(jiǎn)單實(shí)用的例子:

        package com.lifeware.study.reflection;
        import java.lang.reflect.InvocationHandler;
        import java.lang.reflect.Method;
        import java.lang.reflect.Proxy;
        public class DynamicProxyTest {
        /**
        * @param args
        */
        public static void main(String[] args) {
        // TODO Auto-generated method stub
        CalculatorProtocol server = new Server();
        InvocationHandler handler = new CalculatorHandler(server);
        CalculatorProtocol client = (CalculatorProtocol)Proxy.newProxyInstance(server.getClass().getClassLoader(),
        server.getClass().getInterfaces(), handler);
        int result = client.add(3, 2);
        System.out.println(“3+2=” + result);
        result = client.subtract(5, 2);
        System.out.println(“5-2=” + result);
        }
        }
        //定義一個(gè)接口協(xié)議
        interface CalculatorProtocol{
        public int add(int a,int b);
        public int subtract(int a,int b);
        }
        //實(shí)現(xiàn)接口協(xié)議
        class Server implements CalculatorProtocol{
        public int add(int a,int b){
        return a+b;
        }

        public int subtract(int a,int b){
        return a-b;
        }
        }
        class CalculatorHandler implements InvocationHandler{
        private Object objOriginal;
        public CalculatorHandler(Object obj){
        this.objOriginal = obj;
        }

        public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
        //可加入預(yù)處理
        Object result = method.invoke(this.objOriginal, args);
        return result;

        }

        }

        ~~EOF~~

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        java反射機(jī)制及動(dòng)態(tài)代理

        java反射機(jī)制及動(dòng)態(tài)代理:目前正在看Hadoop RPC框架的源碼,在深入了解這些之前,有一些基礎(chǔ)知識(shí)需要回顧下。 1. java反射機(jī)制及動(dòng)態(tài)代理 2. java網(wǎng)絡(luò)編程 3. java NIO 先總結(jié)下第一個(gè),java反射機(jī)制及動(dòng)態(tài)代理的相關(guān)知識(shí)點(diǎn): java反射機(jī)制 在看與java反射機(jī)制相關(guān)的代碼前,試著
        推薦度:
        標(biāo)簽: 代理 動(dòng)態(tài) 在看
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久亚洲精品中文字幕无码| 中国在线观看免费国语版| 亚洲欧洲日产国码av系列天堂| 亚洲国产日韩在线视频| 四虎国产精品永免费| 成人免费视频国产| 亚洲AV永久无码精品网站在线观看| 一二三四免费观看在线视频中文版 | 免费观看91视频| 亚洲成色www久久网站夜月| 国产猛男猛女超爽免费视频| 亚洲国产人成在线观看69网站 | 亚洲va久久久噜噜噜久久男同| 两个人看的www视频免费完整版| 久久精品国产亚洲综合色| 精选影视免费在线 | 亚洲AV无码成人精品区蜜桃| 无码日韩精品一区二区免费暖暖 | 亚洲精品天堂成人片AV在线播放 | free哆拍拍免费永久视频| 久久久久亚洲av毛片大| APP在线免费观看视频| 亚洲熟妇无码爱v在线观看| 在线看片韩国免费人成视频| 亚洲丶国产丶欧美一区二区三区| 免费v片视频在线观看视频| 中文字幕手机在线免费看电影| 亚洲视频在线观看免费| 国产成人免费网站| 色婷婷精品免费视频| 亚洲AV无码久久寂寞少妇| 三年片在线观看免费大全 | 亚洲精品天堂在线观看| 免费一级毛片免费播放| 日本不卡免费新一区二区三区| 亚洲一区二区三区亚瑟| 波多野结衣免费视频观看| 亚在线观看免费视频入口| 久久亚洲精品国产亚洲老地址| 免费一级大黄特色大片| 蜜桃成人无码区免费视频网站|