Android日志中的活动类名称后面的美元($)符号(非匿名内部类)

Bad*_*ode 4 java debugging android

我正在浏览我的应用程序的一些崩溃日志,堆栈跟踪显示如下:

at MyActivity.formatDouble(MyActivity.java:182)
at MyActivity.access$47(MyActivity.java:196)    
at MyActivity$28.onCameraChange(MyActivity.java:167)
Run Code Online (Sandbox Code Playgroud)

"MyActivity"是一项活动,因此不是匿名的内部类.我不能确定#3线上的美元符号(以及第2行中的美元符号)

Jon*_*eet 7

我怀疑第167行是在一个匿名类 MyActivity,这access$47只是一个允许onCameraChange在其中调用私有方法的trampoline方法MyActivity.(JVM不允许这样做,因此Java编译器会创建一个允许它的方法.)

您甚至可以使用简单的Java类轻松地看到这一点:

public class Test {

    private static void privateMethod() {
        throw new RuntimeException();
    }

    public static void main(String[] args) throws Exception {
        Runnable runnable = new Runnable() {
            @Override public void run() {
                privateMethod();
            }
        };
        runnable.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了一个类似于你所示的堆栈跟踪:

Exception in thread "main" java.lang.RuntimeException
        at Test.privateMethod(Test.java:4)
        at Test.access$000(Test.java:1)
        at Test$1.run(Test.java:10)
        at Test.main(Test.java:13)
Run Code Online (Sandbox Code Playgroud)

Test$1.run是内一个匿名内部类内main,并且access$000方法被提供访问privateMethod.