我有一個名爲StaticInitializer.class
的類文件,該文件成功地進行了模糊處理。 當我反編譯它時,我得到以下結果,其中IDE給出編譯器錯誤「Cannot return from within an initializer
」。刪除「return
」聲明可解決問題。 但事實上,我想知道的是,如果在靜態初始化器中有return
語句,混淆的類文件如何正常工作。反編譯的混淆代碼「無法從初始化程序中返回」
java文件的編譯和運行階段之間是否存在不匹配,混淆是否會將其作爲混淆的一種方式進行檢測和使用?
反編譯的代碼
public class StaticInitializer {
static {
int a=12;
int b=34;
return ;
}
}
被修改: 繼運行表明,混淆類文件是與JDK 1.5
javap -c StaticInitializer.class
major version: 49
J2SE 8 = 52, J2SE 7 = 51編譯, J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45
反編譯器不是神靈。他們可以犯錯誤。 – BackSlash
在以前版本的Java中(直到Java 7),可以通過靜態塊而不是主要方法來運行應用程序。他們刪除了所有可以執行此操作的'伎倆'或'黑客',也許這會對其產生影響。另外:由於BackSlash指出:反編譯器可能會犯錯誤。大多數反編譯器都是Java的幾個版本,而不是最新的最新限制,這就是爲什麼它可能認爲return語句是一個有效的語句。 – Stultuske
@Stultuske你仍然可以這樣做([DEMO](http://ideone.com/REAXnL)),因爲在類被調用之前,靜態塊會被執行,***之前***任何其他方法。即使你不能,一個'static'塊中的return也不是一個有效的語句。 – BackSlash