2014-03-28 47 views
0

我正在閱讀反編譯的Java軟件的源代碼。它被混淆了,但我認爲它也應該遵守Java的規則。我希望這個類NK$1被稱爲this.b.a.q()的方法,但我沒有找到關於b成員的任何信息,即使對於成員及其q()方法。爲什麼代碼是這樣的?在反編譯混淆匿名內部類中找不到「this.b.a.q()」方法

嗨,根據你的回答,我發現在外部類bNK。但是我仍然找不到a,因爲bJButton對象,我不覺得aJButton有嗎?我在下面添加了外部類代碼。

1)下面是整個文件NK$1.class(就像NK$1.java

package com.xxx; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

class NK$1 
    implements ActionListener 
{ 
    NK$1(NK paramNK, NI paramNI) {} 

    public void actionPerformed(ActionEvent paramActionEvent) 
    { 
    this.b.a.q(); ------------------> where is the b? 
    } 
} 

2)下面是NK.class(外類)

package com.xxx; 

import javax.swing.Icon; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

class NK 
    extends JPanel 
{ 
    private JButton b; <-------------- this is b, but where is the a in "this.b.a.q()"? 

    NK(NI paramNI) 
    { 
    double[][] arrayOfDouble = { { 5.0D, -1.0D, -2.0D, 10.0D, -2.0D, 10.0D, -2.0D, 10.0D, -2.0D, 10.0D, -2.0D, 5.0D }, { 5.0D, -2.0D, 5.0D } }; 




    ayI localayI = new ayI(arrayOfDouble); 
    setLayout(localayI); 

    JButton localJButton = new JButton("Load"); 
    this.b = localJButton; 
    add(localJButton, "8,1,c,c"); 

    localJButton.setMnemonic(76); 
    Icon localIcon = Fi.b(); 
    if (localIcon != null) { 
     localJButton.setIcon(localIcon); 
    } 
    localJButton.addActionListener(new NK.1(this, paramNI)); <---------Here is the inner class 






    localJButton = FJ.d(); 
    localJButton.setMnemonic(72); 
    add(localJButton, "1,1,l,c"); 

    localJButton.addActionListener(new NK.2(this, paramNI)); 
    if ((Gr.z() != null) && (!FI.ao())) 
    { 
     paramNI.h = new JButton("Download updates"); 
     paramNI.h.setMnemonic(68); 
     paramNI.i = new NJ(paramNI); 
     add(paramNI.h, "2,1,c,c"); 

     localIcon = Fi.c("SUITE_DOWNLOAD"); 
     if (localIcon != null) { 
     paramNI.h.setIcon(localIcon); 
     } 
     paramNI.h.addActionListener(new NK.3(this, paramNI)); 
    } 
    else 
    { 
     add(localJButton, "2,1,c,c"); 
    } 
    localJButton = new JButton("Refresh"); 
    add(localJButton, "6,1,c,c"); 

    localIcon = Fi.c("REFRESH"); 
    if (localIcon != null) { 
     localJButton.setIcon(localIcon); 
    } 
    localJButton.addActionListener(new NK.4(this, paramNI)); 






    localJButton = new JButton("Close"); 
    localJButton.setMnemonic(67); 
    add(localJButton, "10,1,c,c"); 
    localIcon = Fi.d(); 
    if (localIcon != null) { 
     localJButton.setIcon(localIcon); 
    } 
    localJButton.addActionListener(new NK.5(this, paramNI)); 
    } 

    public JButton a() 
    { 
    return this.b; 
    } 
} 
+0

你正在使用哪一個反編譯器?他們並不都能很好地處理內部的課程。 –

+0

你是對的,JD-GUI存在缺陷 – hsluoyz

回答

2

內部類可以從它們的外引用變量類。在反編譯的代碼中,沒有顯示。我相信你的this.b.a.q();是指你的外部類(=你的匿名類定義的類)中的某個東西。

看到這個例子。我已經寫了一類這樣的:

public class ContainsAnonymousInnerClass { 
    public String s = ""; 
    public void m() { 
     new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       s.toString(); 
      } 
     }; 
    } 
} 

當我用JAD反編譯內部類ContainsAnonymousInnerClass$1.class,我得到這個:

class ContainsAnonymousInnerClass$1 implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     s.toString(); // Notice this - it is not prefixed by this$0 as one would expect! 
    } 

    final ContainsAnonymousInnerClass this$0; 
    ContainsAnonymousInnerClass$1() { 
     this$0 = ContainsAnonymousInnerClass.this; // reference to the outer class 
     super(); 
    } 
} 

正如你所看到的,只是純粹的s.toString();沒有通過this$0前綴。當然,它實際上調用是this$0.s.toString();所以反編譯的代碼不服從的Java規則:)

我使用ProGuard得到這個結果混淆同一類:

class ContainsAnonymousInnerClass$1 implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     String _tmp = a.a; // which was originally s.toString(); 
    } 
    private ContainsAnonymousInnerClass a; 
} 

當你寫你的類文件被混淆了,我堅信這是一個調用你的一些外部類的成員的方法。混淆器軟件有很多參數來設置混淆名稱的方式,因此很難說出具體的名稱。你將不得不自己找到它:)

+0

嗨,根據你的方法,我找到了「b」,但是仍然沒有找到「a」,細節被附加在問題中。 thx – hsluoyz

+0

假設一切都被混淆了,「a」是JButton的成員。難道你不能通過你的應用程序的行爲來猜測它,你的事件監聽器做了什麼?它可能與按鈕交互 - 它可能會按下它,禁用/啓用它,... –

+0

在我的理解中,JButton是一個內置的類。在JButton中有一個「a」成員嗎?這個ActionListener是一個名爲「Load」的按鈕的左單擊處理程序,我只想知道按鈕單擊事件觸發器的哪部分代碼,所以我認爲this.baq ()應該與UI無關嗎? – hsluoyz