Java類如何實現一個類的障眼法(JadClipse的bug)
Java類實現一個類的障眼法
眾所周知,Java的類只能去實現(implements)一個或多個接口,而不能去實現(implements)一個類。
然而,有的朋友可能會注意到這樣的現象,在eclipse里,查看JDBC的com.mysql.cj.Driver.class和它的父類com.mysql.cj.NonRegisteringDriver.class源碼,鼠標放到NonRegisteringDriver所實現的接口名Driver上,確確實實地看到tooltip提示“com.mysql.cj.Driver”
如下圖所示:

什么鬼?Java類還可以實現類了嗎?老師不是這么教的啊。。試試能不能鼠標點進去 。。

竟然真的點進來了。。 定睛一看,這個Driver繼承了NonRegisteringDriver,而NonRegisteringDriver又實現了Driver,這是什么操作?其實,這個是個障眼法而已,類怎么能實現另一個類呢?那到底是誰搞的鬼?答案是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的時候出現了一些錯誤。
Jad的bug和限制
- 包含有內部類,則jad處理構造函數的參數時會出錯;
- 不支持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處理不好。
所以說,查看反編譯出來的源碼時,眼見不一定為真。想要查看源碼,最靠譜的還是盡量找到源碼包關聯起來。
最終,下載并關聯源碼包,發(fā)現com.mysql.cj.jdbc.NonRegisteringDriver真正實現的是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
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Kotlin + Retrofit + RxJava簡單封裝使用詳解
這篇文章主要介紹了Kotlin + Retrofit + RxJava簡單封裝使用詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
關于Java中try finally return語句的執(zhí)行順序淺析
這篇文章主要介紹了關于Java中try finally return語句的執(zhí)行順序淺析,需要的朋友可以參考下2017-08-08
java正則表達式獲取指定HTML標簽的指定屬性值且替換的方法
下面小編就為大家?guī)硪黄猨ava正則表達式獲取指定HTML標簽的指定屬性值且替換的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12

