2014-03-28 2 views
0

디 컴파일 된 Java 소프트웨어의 소스 코드를 읽었습니다. 그것은 난독 화되었지만 자바의 규칙에도 복종해야한다고 생각합니다. 이 클래스 NK$1this.b.a.q() 메서드라고 부르길 원하지만, 회원의 경우에도 q() 메서드의 경우에도 b 멤버에 대해 아무 것도 찾지 못했습니다. 코드가 왜 이렇게 생겼습니까?디 컴파일 된 난독 화 익명 내부 클래스에서 "this.b.a.q()"메서드를 찾을 수 없습니다.

안녕하세요, 귀하의 대답을 바탕으로, NKb이 발견되었습니다. 그러나 bJButton 개체이기 때문에 여전히 a을 찾을 수 없습니다. 회원이 있다고 생각하지 않습니다. aJButton에 있습니까? 아래에 외부 클래스 코드를 추가했습니다.

1) 이하 단지 NK$1.java 같이 전체 파일 NK$1.class()

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(); 
    } 
} 

당신이 볼 수 있듯이, this$0에 의해 접두어없이 s.toString(); 순수한. 물론 실제로 부르는 this$0.s.toString();이 때문에 디 컴파일 코드가

나는이 결과 점점 ProGuard를 사용하여 동일한 클래스를 난독 자바 규칙을 :) 순종하지 않는 것입니다 : 당신이 쓴 것처럼

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

을 당신의 클래스 파일 난 잘 모르겠다. 나는 라고 외친다. 그것은 외부 클래스의 멤버 메소드에 대한 호출이다. obfuscator 소프트웨어에는 이름을 난독 화하는 방법을 설정하는 많은 매개 변수가 있으므로 어떤 것을 정확하게 말하기는 어렵습니다. 당신은 그것을 스스로 찾아야 할 것입니다 :)

+0

안녕하세요, 귀하의 방법에 따라, "b"를 발견했지만 여전히 "a"를 찾지 못했고 세부 사항이 질문에 추가되었습니다. thx – hsluoyz

+0

모든 것이 난독 화되었다고 가정하면 "a"는 JButton의 멤버입니다. 응용 프로그램의 동작, 이벤트 수신기에서 수행하는 동작으로 추측 할 수 있습니까? 아마도 버튼과 상호 작용할 것입니다 - 버튼을 누르거나, 활성화/비활성화 할 수 있습니다 ... –

+0

제 생각에 JButton은 내장 클래스입니다. JButton에 "a"멤버가 있습니까?이 ActionListener는 "Load"라는 버튼에 대한 왼쪽 싱글 클릭 핸들러입니다. 코드의 어느 부분이 버튼 클릭 이벤트 트리거인지 알고 싶습니다. 그래서 this.baq를 생각했습니다.()는 UI와 아무런 관련이 없습니까? – hsluoyz