Java декомпиляция - PullRequest
       23

Java декомпиляция

8 голосов
/ 21 февраля 2012

При декомпиляции конкретного jar-файла с использованием java-декомпилятора (http://java.decompiler.free.fr/) Я получил какой-то странный код, я не могу определить, что есть. Кто-то может мне помочь? Код похож на:

Foo.access$004(Foo.this);

или это

Bar.access$006(Bar.this);

или еще

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

Что это за методы access$004, access$006 и access$102?

Ответы [ 3 ]

15 голосов
/ 21 февраля 2012

Синтетические методы, подобные этому, создаются для поддержки доступа к закрытым методам внутренних классов.Так как внутренние классы не были частью начальной версии jvm, модификаторы доступа не могли действительно обработать этот случай.Решением было создание дополнительных видимых для пакета методов, которые делегируют частной реализации.

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.

2 голосов
/ 21 февраля 2012

Это автоматически генерируемые методы, которые создаются компилятором в некоторых случаях (например, при непосредственном доступе к закрытым полям другого класса, например, в случае вложенных классов).

См. Также Что означает «статический синтетический»? и Синтетический класс в Java .

0 голосов
/ 27 января 2016

Если вы получили соответствующий файл .class (запустите jar через unzip) и запустите файл .class через JAD

JAD MyClass.class

тогда вы можете обнаружить, что выходной JAD-файл декомпилировал эту конкретную строку более осмысленным образом, например,

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

отображается в выводе JAD просто

myMemberVaiable = true

где myMemberVaiable является членом класса Baz, которого вы узнаете.

...