Inner classes may reference the variables from their outer class. In the decompiled code, it is not shown. I believe that your this.b.a.q();
refers to something which is in your outer class (= the class where your anonymous class is defined).
See this example. I have written a class like this:
public class ContainsAnonymousInnerClass {
public String s = "";
public void m() {
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
s.toString();
}
};
}
}
When I decompile the inner class ContainsAnonymousInnerClass$1.class
using JAD, I get this:
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();
}
}
As you can see, just pure s.toString();
without prefixing by this$0
. Of course what it calls in fact is this$0.s.toString();
so the decompiled code does not obey the Java rules :)
I obfuscated the same class using ProGuard getting this result:
class ContainsAnonymousInnerClass$1 implements ActionListener {
public void actionPerformed(ActionEvent e) {
String _tmp = a.a; // which was originally s.toString();
}
private ContainsAnonymousInnerClass a;
}
As you wrote that your class files are obfuscated, I strongly believe it is a call to some of your outer class's member's method. The obfuscator software has a lot of parameters setting how exactly it obfuscates the names so it's difficult to say which exactly. You will have to find it yourself :)