首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java反编译

java反编译
EN

Stack Overflow用户
提问于 2012-02-21 22:13:41
回答 3查看 4.6K关注 0票数 8

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

代码语言:javascript
复制
Foo.access$004(Foo.this);

或者这个

代码语言:javascript
复制
Bar.access$006(Bar.this);

否则

代码语言:javascript
复制
Baz.access$102(Baz.this, true)

access$004access$006access$102是什么方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-21 22:26:18

创建这样的合成方法是为了支持访问内部类的私有方法。由于内部类不是初始jvm版本的一部分,因此访问修饰符不能真正处理这种情况。解决方案是创建额外的包可见方法,这些方法委托给私有实现。

代码语言:javascript
复制
public class Example {
    private static class Inner {
         private void innerMethod() { ... }
    }

    public void test() {
        Inner inner = ...
        inner.innerMethod():
    }
}

编译器将创建Inner类的新方法,如下所示:

代码语言:javascript
复制
static void access$000(Inner inner) {
    inner.innerMethod();
}

并替换test方法中的调用,如下所示:

代码语言:javascript
复制
Inner.access$000(inner);

静态access$000是包可见的,因此可以从外部类访问,并且在同一个Inner类中,它可以委托给私有innerMethod

票数 16
EN

Stack Overflow用户

发布于 2012-02-21 22:19:34

这些是由编译器在某些情况下创建的自动生成的方法(例如,当直接访问另一个类的私有字段时,例如,在嵌套类的情况下)。

另请参见What is the meaning of "static synthetic"?Synthetic Class in Java

票数 2
EN

Stack Overflow用户

发布于 2016-01-27 08:23:08

如果您获得了相关的.class文件(通过解压缩运行jar ),并通过JAD运行.class文件

代码语言:javascript
复制
JAD MyClass.class

然后,您可能会发现输出JAD文件以更有意义的方式反编译了特定的行,例如

代码语言:javascript
复制
Baz.access$102(Baz.this, true)

在JAD输出中显示为

代码语言:javascript
复制
myMemberVaiable = true

其中myMemberVaiable是Baz类的成员,您可以识别它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9379048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档