2014-03-28 20 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