91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Tomcat的Class Loader加載類的方法是什么

發布時間:2022-01-14 09:09:08 來源:億速云 閱讀:125 作者:iii 欄目:大數據

本篇內容主要講解“Tomcat的Class Loader加載類的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Tomcat的Class Loader加載類的方法是什么”吧!

從我們眾所周知的 Java 到 Groovy,Jython, Scala 這些新青年們,這些語言的成功,除了語言的豐富特性外,還離不開強大的 JVM。

正在因為站在 JVM 的肩上,新青年們才看的更遠。

雖說 JVM 之上可能跑這些小青年,但原則還是有的。畢竟 JVM 的第一個字母可是 J。

這里說的原則,或者說新青年們能跑在 JVM 這個舞臺上的,是因為他們在使用各自語言語法編寫之后,生成的內容都是 class 文件。 沒錯,就是那個和 Java

的 class 一樣的 class。每個語言使用自己的編譯器,按照規范生成 class 文件。

你是XX 請來對比這些語言的么?

當然不是。

我們主要看看這些操作 class 的階段與方式,是誰在什么時候動了你的「class」。

還記得初學 Java 時,滿懷信心的在命令行敲下 javac HelloWorld.java 的情形么? 運行程序時看著輸出的「Hello World」,感覺這門語言已經上傳完成,

全部進入你的大腦,可以改變世界了。

這里的javac 生產class, 他可不是class的搬運工。

常用 IDE 之后,寫完代碼,隨著保存或者運行Main Class, 這個生成class的過程被隱藏了起來,連是誰編譯的都不清楚。

甚至使用 Maven、Gradle 之后,每次都是在IDE 里雙擊666,拿著打好的包直接運行了。編譯的過程,甚至打包出來的產物,都變成了一個可忽視的步驟。

但話說回來, class 在 JVM 中扮演著一個至關重要的角色, JVM 加載 「class」 之后,才生成了對應的 「Class」(注意C大寫了) 對象,進而生成各個你們面向的「對象」。

所以有不少的工具、框架,在是 class 上做文章,通過操作class 的內容,來實現一些特定的功能。比如

Hibernate、OpenJPA 都是通過編譯或者運行時增強,來修改 Domain Entity class。

大名鼎鼎的 Spring, 除了 Cglib這一類的動態代理功能實現AOP外,也提供了 LTW (Load Time Weave) 的功能,在加載 class的時候進行功能增強。

而對一個 class 進行 transform,入口在 Java 的 Instrumentation。  我們知道,這是 Java agent 實現的核心。無論是在運行前以javaagent 的方式

指定,還是在運行時通過 Attach 機制再連接上去,都會拿到 Instrumentation的一個實例。 有了它,可以進行一個addTransformer 的操作,

「沒錯,不是添加「變形金鋼」」,是添加類的轉換器,通過transformer,把類給改了。

這里的 LTW, 如果運行在 類似 Tomcat 這一類的容器中,由于類是由容器的 ClassLoader 來進行加載 ,少不了需要容器支持。

在 Tomcat 8.x 中,新增了 InstrumentableClassLoader, 用于在加載類的時候進行類的 instrument。該 classLoader 需要添加一個transformer

用于對后續加載的class 進行 transform。

下方是具體 Tomcat 的ClassLoader在加載類時執行的操作:

Tomcat 在 addTransformer 之后,需要加載class時,如果是新加載,則會向下走,再根據transformer執行操作

        Iterator i$ = this.transformers.iterator(); // 這里是添加進來的轉換器

            while(i$.hasNext()) {

                ClassFileTransformer transformer = (ClassFileTransformer)i$.next();

                try {

                    byte[] transformed = transformer.transform(this, internalName, (Class)null, (ProtectionDomain)null, binaryContent);

                    if(transformed != null) {

                        binaryContent = transformed;

                    }

                }

        }

        try {

// 這里創建類的時候,使用了轉換之后的二進制內容

            clazz = this.defineClass(name, binaryContent, 0, binaryContent.length, new CodeSource(codeBase, certificates));

        } catch (UnsupportedClassVersionError var17) { }

除此之外,我們還可以在運行時修改 Class的定義,新增或者變更方法等,這個可以依賴 JVM 的 Attach機制,獲取 Instrument 后再進行class的reDefine,這個我們在之前的文章中有過介紹:

類加載器與類的熱替換(Hotswap)

所以,build time 或者 runtime 時對于 class 文件或者已加載的二進制內容會做修改,甚至在運行時也會被重新定義,進而生成新的Class。 所以這個也是可以運行在瀏覽器中的 Applet  需要運行在一個沙箱中保證安全的原因。

如果在應用運行時,遇到了比較怪異的行為,和你看到的源碼不一致,不必驚訝,可能 class 是被修改過的。此時我們之前介紹過的一件武器就派上了用場:

SA 可以將你疑惑的class 結構顯示出來,或者dump到本地仔細觀察。

到此,相信大家對“Tomcat的Class Loader加載類的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐河县| 喀什市| 明光市| 阳城县| 新野县| 台前县| 工布江达县| 德令哈市| 罗甸县| 霍邱县| 宁夏| 东港市| 贡嘎县| 云阳县| 葫芦岛市| 定日县| 高雄县| 长葛市| 甘泉县| 梅河口市| 祁东县| 鄂托克前旗| 河池市| 周至县| 巢湖市| 承德市| 永新县| 如皋市| 闽侯县| 虞城县| 德州市| 汤阴县| 永安市| 长阳| 荣成市| 南雄市| 临海市| 梁山县| 壶关县| 张掖市| 宁安市|