Java類如何實現(xiàn)一個類的障眼法(JadClipse的bug)
Java類實現(xiàn)一個類的障眼法
眾所周知,Java的類只能去實現(xiàn)(implements)一個或多個接口,而不能去實現(xiàn)(implements)一個類。
然而,有的朋友可能會注意到這樣的現(xiàn)象,在eclipse里,查看JDBC的com.mysql.cj.Driver.class和它的父類com.mysql.cj.NonRegisteringDriver.class源碼,鼠標放到NonRegisteringDriver所實現(xiàn)的接口名Driver上,確確實實地看到tooltip提示“com.mysql.cj.Driver”
如下圖所示:
什么鬼?Java類還可以實現(xiàn)類了嗎?老師不是這么教的啊。。試試能不能鼠標點進去 。。
竟然真的點進來了。。 定睛一看,這個Driver繼承了NonRegisteringDriver,而NonRegisteringDriver又實現(xiàn)了Driver,這是什么操作?其實,這個是個障眼法而已,類怎么能實現(xiàn)另一個類呢?那到底是誰搞的鬼?答案是eclipse的反編譯插件JadClipse。
一般情況下,我們需要在IDE中較為方便地查看第三方jar包的源代碼時,一種方法是,可以安裝反編譯插件JadClipse等,但是需要注意的是,這些反編譯插件是有漏洞的,不然所有的class文件都能被無誤地反編譯出來,那所有就都是開源的了。
那怎么確定反編譯是否有錯?可以查看反編譯后的代碼末尾,都會有反編譯過程的報告信息和錯誤異常,如下:
/*jadclipse*/// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. package com.mysql.cj.jdbc; import com.mysql.cj.*; import xx..; // Referenced classes of package com.mysql.cj.jdbc: // ConnectionImpl, JdbcPropertySetImpl, AbandonedConnectionCleanupThread, JdbcConnection public class NonRegisteringDriver implements Driver { ... } /* DECOMPILATION REPORT Decompiled from: D:\maven-repository\mysql\mysql-connector-java\8.0.13\mysql-connector-java-8.0.13.jar Total time: 55 ms Jad reported messages/errors: Couldn't fully decompile method cleanup Couldn't resolve all exception handlers in method cleanup Couldn't fully decompile method connect Couldn't resolve all exception handlers in method connect Exit status: 0 Caught exceptions: */
很明顯看到,反編譯類com.mysql.cj.jdbc.NonRegisteringDriver的時候出現(xiàn)了一些錯誤。
Jad的bug和限制
- 包含有內部類,則jad處理構造函數(shù)的參數(shù)時會出錯;
- 不支持zip和jar包(注:如果使用Eclipse插件,則很容易得到包中的某個類的反編譯代碼);
- 當有標簽塊,嵌套循環(huán)中有break/continue,有goto語句的時候,會提示信息“Couldn't fully decompile method <name>”;當有try-catch-finally語句的時候會提示信息“Couldn't resolve all exception handlers in method <name>”;
- 目前,Jad忽略了行號表屬性和源文件屬性的內容;
- Jad不能處理繼承信息,總是把java.lang.Object作為兩個不同類的通用父類,需要的時候做強制轉換;
- Jad對inlined functions處理不好。
所以說,查看反編譯出來的源碼時,眼見不一定為真。想要查看源碼,最靠譜的還是盡量找到源碼包關聯(lián)起來。
最終,下載并關聯(lián)源碼包,發(fā)現(xiàn)com.mysql.cj.jdbc.NonRegisteringDriver真正實現(xiàn)的是java.sql.Driver。
我的環(huán)境如下
- eclipse Version: Mars.2 Release (4.5.2)
- JadClipse Version: v1.5.8g
- mysql-connector-java.jar Version: 8.0.13
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決在微服務環(huán)境下遠程調用feign和異步線程存在請求數(shù)據(jù)丟失問題
這篇文章主要介紹了解決在微服務環(huán)境下遠程調用feign和異步線程存在請求數(shù)據(jù)丟失問題,主要包括無異步線程得情況下feign遠程調用,異步情況下丟失上下文問題,需要的朋友可以參考下2022-05-05springboot詳解實現(xiàn)車險理賠信息管理系統(tǒng)代碼
本系統(tǒng)基于Springboot開發(fā)實現(xiàn)了一個為用戶車險進行理賠信息管理的一個信息化管理系統(tǒng),核心的業(yè)務主要是用戶申請保險理賠,管理員審核進入理賠程序,事故調查員對事故進行調查和現(xiàn)場勘察,這其中共涉及到三類用戶,購買保險的客戶,事故調查員和系統(tǒng)管理員2022-06-06SpringBoot?整合?ElasticSearch操作各種高級查詢搜索
這篇文章主要介紹了SpringBoot?整合?ES?進行各種高級查詢搜索的實踐記錄,本文主要圍繞?SpringBoot?整合?ElasticSearch?進行各種高級查詢的介紹,需要的朋友可以參考下2022-06-06RabbitMQ開啟SSL與SpringBoot連接測試的配置方法
本文基于 CentOS 7 + Git + OpenSSL + yum 安裝的 RabbitMQ,需要讀者提交安裝好。其他方式也可變通參考本文。對RabbitMQ開啟SSL與SpringBoot連接測試相關知識感興趣的朋友一起看看吧2022-01-01springsecurity?登錄認證流程分析一(ajax)
這篇文章主要介紹了springsecurity?登錄認證一(ajax篇),本文通過實例代碼圖文相結合給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-08-08