如何将匿名类重新集成到ECD反编译器生成的Java代码中?

时间:2018-04-24 01:20:51

标签: java decompiling

我有一个学校的罐子应该被反编译,修改和重新评估。我使用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中意味着什么?

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的角度来看,没有匿名内部类,只有命名类。