java反编译

9 浏览
0 Comments

java反编译

当使用Java反编译器(http://java.decompiler.free.fr/)对特定的jar文件进行反编译时,我得到了一些奇怪的代码,我无法确定是什么。有人可以帮我吗?代码类似于:\n

Foo.access$004(Foo.this);

\n或者\n

Bar.access$006(Bar.this);

\n或者其他\n

Baz.access$102(Baz.this, true)

\n这些方法access$004access$006access$102是什么意思?

0
0 Comments

在进行Java反编译时,有时会出现输出的代码不够清晰和易读的问题。解决这个问题的方法是使用JAD(Java反编译器)进行反编译。

要解决这个问题,首先需要获取相关的.class文件(通过解压缩.jar文件)。然后,将.class文件通过JAD进行反编译。使用以下命令可以进行反编译:

JAD MyClass.class

通过JAD进行反编译后,你可能会发现输出的JAD文件以更加有意义的方式反编译了特定行的代码,例如:

Baz.access$102(Baz.this, true)

在JAD的输出中显示为:

myMemberVariable = true

其中,myMemberVariable是Baz类的一个成员变量,你将会认识到它。

通过以上的解决方法,你可以获得更加清晰和易读的反编译代码。

0
0 Comments

在Java中,有时编译器会自动生成一些方法,这些方法通常在访问另一个类的私有字段时使用,比如在嵌套类的情况下。这些方法被称为"static synthetic"(静态合成方法)。

在stackoverflow的一个问题中(链接:What is the meaning of "static synthetic"?),解释了"static synthetic"的含义。它表示这些方法是由编译器生成的,用于实现某些特殊的功能,而不是由开发人员显式编写的。这些方法通常不会被开发人员直接调用,而是由编译器在需要的时候隐式地调用。

此外,还有一个与此相关的问题(链接:Synthetic Class in Java),讨论了Java中的合成类(synthetic class)。合成类是由编译器生成的,用于实现某些特殊的功能,比如内部类的访问控制。这些合成类通常不会在开发人员的代码中显式出现。

这些自动生成的方法和合成类的存在是为了满足Java语言的一些特殊需求,并且它们在编译过程中起到重要的作用。然而,有时候开发人员可能会对它们产生疑惑,特别是在进行代码反编译时。因此,了解它们的存在和用途是很重要的。

为了解决这个问题,开发人员可以通过查阅相关文档或参考上述的stackoverflow问题来了解"static synthetic"方法和合成类的含义和用途。此外,他们还可以使用Java反编译工具来分析和理解这些自动生成的方法和合成类的实际代码实现。这样可以更好地理解和调试代码,并确保代码的正确性和性能。

总之,"static synthetic"方法和合成类是Java编译器在某些情况下自动生成的,用于实现特殊功能的方法和类。虽然它们可能会导致开发人员在反编译或调试代码时感到困惑,但了解它们的存在和用途可以帮助开发人员更好地理解和使用Java语言。

0
0 Comments

在Java中,当需要访问内部类的私有方法时,会创建合成方法(Synthetic methods)。由于内部类在初始的Java虚拟机版本中并不存在,因此访问修饰符无法处理这种情况。解决方法是创建额外的包可见方法,以委托私有实现。

例如,有如下代码:

public class Example {
    private static class Inner {
         private void innerMethod() { ... }
    }
    public void test() {
        Inner inner = ...
        inner.innerMethod():
    }
}

编译器会为`Inner`类创建一个新的方法,如下所示:

static void access$000(Inner inner) {
    inner.innerMethod();
}

并且将`test`方法中的调用替换为:

Inner.access$000(inner);

静态的`access$000`方法是包可见的,因此可以从外部类访问,并且作为同一个`Inner`类的一部分,它可以委托给私有的`innerMethod`方法。

0