我有一个学校的罐子应该被反编译,修改和重新评估。我使用Eclipse的ECD插件反编译了所有类文件,但我想我有一些提取的匿名类,需要合并回另一个类。我有一个P级,然后又有五个名为P $ 1,P $ 2,......,P $ 5的类。
以下是P:
的问题部分public class P {
private ArrayList<Family> group;
private int marker;
private Integer primaryElement;
Comparator<Family> c;
public P(ArrayList<Family> g, Integer i, Comparator<Family> c) {
this.marker = -1;
this.group = new ArrayList(g);
this.primaryElement = i;
this.c = c;
}
/* Some unrelated methods */
public String printHeader() {
return this.print(new 1(this));
}
public String printRow(Integer i) {
return this.print(new 2(this, i));
}
public String printPad() {
return this.print(new 3(this));
}
public Object printCost() {
return this.print(new 4(this));
}
public String printLine() {
return this.print(new 5(this));
}
这是P $ 1。其他人非常相似。
final class P$1 implements PrintCommand {
P$1(P arg0) {
this.this$0 = arg0;
}
public String print(Family f) {
return String.format("%3d", new Object[]{Integer.valueOf(f.getId())});
}
}
如果你想知道,PrintCommand是一个超级简单的界面:
public interface PrintCommand {
String print(Family arg0);
}
如何将P $ 1合并回P?此外, this.this $ 0 在P $ 1中意味着什么?
答案 0 :(得分:2)
在匿名课程中,您可以使用this
引用封闭班级中的P.this
。为此,java编译器将创建一个构造函数,该构造函数将名为this$0
的字段设置为传递给构造函数的引用。
原始代码可能如下所示:
public String printHeader() {
return this.print(new PrintCommand() {
public String print(Family f) {
return String.format(%3d", f.getId());
}
);
}
编译器还有其他功能,例如为内部类中访问的封闭类添加私有方法/字段的访问器方法。或者将内部类中使用的(有效)最终变量的值传递给构造函数。
从Java Runtime的角度来看,没有匿名内部类,只有命名类。