国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Proxy invocationHandler

terasum / 1290人閱讀

摘要:動態代理即,動態代理是利用反射技術,在運行時創建一個實現某些給定接口的新類。調用該方法調用類中的,參數為空的方法。

動態代理

即,動態代理是利用java反射技術,在運行時創建一個實現某些給定接口的新類。

栗子

先定義接口

public interface people {
    public String work();
}

實現該接口

public class Teacher implements people{

    @Override
    public String work() {
        System.out.println("教書育人");
        return "教書";
    }
}

編寫代理類

import com.sun.xml.internal.ws.api.pipe.FiberContextSwitchInterceptor;

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

public class WorkHandler implements InvocationHandler {
    // 代理類的對象
    private Object obj;

    public WorkHandler(){

    }

    // 在調用這個方法的時候,會被調度到invoke方法,并將參數傳入
    public WorkHandler(Object obj){
        this.obj = obj;
    }
    // 在調用給類的方法的時候,會被調度到invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 真實對象執行之前添加操作
        // 調用obj類的method方法,并且參數為args
        Object invoke = method.invoke(obj, args);
        // 真實對象執行后添加操作
        return invoke;// 返回執行的結果
    }
}

最后運行

import java.io.FileInputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args){
        // 要代理的對象
        people people = new Teacher();  // 創建要代理的真實對象
        // 進行注冊
        InvocationHandler handler = new WorkHandler(people);
        // 進行創建代理對象
        // 定義一個代理對象
        people proxy;
        // 調用Proxy.newProxyInstance方法
        // 需要傳入真實對象實現的接口,為下一步調用該方法做準備
        // 將handler關聯到invocationHandler對象,用于調度到invoke方法
        // 由于返回的對象為object類型,需要進行強制類型轉換,保留people接口定義的方法
        // 最后一個參數要對對象進行關聯,最后批量生產出對象
        proxy = (people) Proxy.newProxyInstance(handler.getClass().getClassLoader(), people.getClass().getInterfaces(), handler);
        System.out.println(proxy.work());
    }
}
第一個參數

第一個參數是運行時,創建的代理對象。

反射+IO操作讀取class文件
import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    // 需要使用static讓其加載進入內存
    static class myClassLoader extends ClassLoader{
        private String classPath;  // 獲取當前類的在磁盤中保存的地址
        // 通過構造函數將地址注入
        public myClassLoader(String classPath){
            this.classPath = classPath;
        }
        // 將文件內容加載進入內存
        private byte[] loadByte(String name) throws Exception{
            // 獲取一個輸入流,
            FileInputStream fis = new FileInputStream(classPath + "/" + name + ".class");
            // 獲取長度
            int len = fis.available();
            // 定義byte數組
            byte[] data = new byte[len];
            // 加載進入內存
            fis.read(data);
            // 關閉流
            fis.close();
            return data;
        }
        // 重寫findClass方法,讓加載的時候調用findClass方法
        protected Class findClass(String name) throws ClassNotFoundException{
            try{
                // 讀取文件到數組中
                byte[] data = loadByte(name);
                // 將字節碼加載進入內存當中
                return defineClass(name, data, 0, data.length);
            }catch(Exception e){
                e.printStackTrace();
            }
            return null;
        }
    }
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {
        // 先初始化該類
        myClassLoader classLoader = new myClassLoader("/home/ming");
        // 此時會調用findClass加載Test.class加載進入內存當中
        Class clazz = classLoader.loadClass("com.ming.Test");
        // 實例化該類對象
        Object obj = clazz.newInstance();
        // 獲取clazz該類方法中名稱為hello,參數為空的方法。
        Method helloMethod = clazz.getDeclaredMethod("helloWorld", null);
       // 調用該方法
        // 調用obj類中的helloMethod,參數為空的方法。
       helloMethod.invoke(obj, null);
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73124.html

相關文章

  • Java動態代理之InvocationHandler最簡單的入門教程

    摘要:網上關于的動態代理,和這些概念有講解得非常高深的文章。現在咱們通過一個最簡單的例子認識什么是。創建一個簡單的類,實現這個接口。看看用如何優雅實現吧希望這個例子能讓大家對的動態代理之有了最基本的了解。 網上關于Java的動態代理,Proxy和InvocationHandler這些概念有講解得非常高深的文章。其實這些概念沒有那么復雜。現在咱們通過一個最簡單的例子認識什么是Invocatio...

    lingdududu 評論0 收藏0
  • Java動態代理之InvocationHandler最簡單的入門教程

    摘要:網上關于的動態代理,和這些概念有講解得非常高深的文章。現在咱們通過一個最簡單的例子認識什么是。創建一個簡單的類,實現這個接口。看看用如何優雅實現吧希望這個例子能讓大家對的動態代理之有了最基本的了解。 網上關于Java的動態代理,Proxy和InvocationHandler這些概念有講解得非常高深的文章。其實這些概念沒有那么復雜。現在咱們通過一個最簡單的例子認識什么是Invocatio...

    Joonas 評論0 收藏0
  • Java 動態代理(Dynamic proxy) 小結

    摘要:代理模式基本概念不論是靜態代理還是動態代理其本質都是代理模式的一種實現那么什么是代理模式呢代理模式即給某一個對象提供一個代理并由代理對象控制對原對象的引用代理模式其實取材于實際生活例如我們生活中常見的房屋租賃代理我們在租房時一般不是直接和房 代理模式 基本概念 不論是靜態代理還是動態代理, 其本質都是代理模式的一種實現, 那么什么是代理模式呢?代理模式, 即給某一個對象提供一個代理, ...

    Jason 評論0 收藏0
  • 慕課網_《模式的秘密之代理模式》學習總結

    時間:2017年08月28日星期一說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:代理模式 1-1 概念介紹 學習本課程基礎 面向對象的設計思維 了解多態的概念 了解反射機制 課程目標 代理模式基本概念及分類...

    wow_worktile 評論0 收藏0
  • Spring AOP(二) 修飾者模式和JDK Proxy

    摘要:修飾者模式設計模式中的修飾者模式能動態地給目標對象增加額外的職責。修飾者模式調用的時序圖如下圖所示。的實現原理和修飾者模式類似。 ?在上邊一篇文章中我們介紹了Spring AOP的基本概念,今天我們就來學習一下與AOP實現相關的修飾者模式和Java Proxy相關的原理,為之后源碼分析打下基礎。 修飾者模式 ?Java設計模式中的修飾者模式能動態地給目標對象增加額外的職責(Respon...

    Jackwoo 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<