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

Java Android日志中活动类名称后的美元($)符号(非匿名内部类),java,android,debugging,Java,Android,Debugging,我正在查看我的应用程序的一些崩溃日志,堆栈跟踪显示如下内容: at MyActivity.formatDouble(MyActivity.java:182) at MyActivity.access$47(MyActivity.java:196) at MyActivity$28.onCameraChange(MyActivity.java:167) “MyActivity”是一个活动,因此不是匿名内部类。我不能确定第3行上的美元符号(第2行中的也是美元符号)我怀疑第167行在MyAc

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

at MyActivity.formatDouble(MyActivity.java:182)
at MyActivity.access$47(MyActivity.java:196)    
at MyActivity$28.onCameraChange(MyActivity.java:167)

“MyActivity”是一个活动,因此不是匿名内部类。我不能确定第3行上的美元符号(第2行中的也是美元符号)

我怀疑第167行在
MyActivity
中的匿名类中,而
access$47
只是一个蹦床方法,允许
onCameraChange
调用
MyActivity
中的私有方法。(JVM不允许这样做,所以Java编译器会创建一个方法来允许它。)

您可以通过一个简单的Java类(甚至不在Android上)轻松看到这一点:

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();
    }
}
这将提供一个类似于您所示的堆栈跟踪:

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)

Test$1.run
位于
main
中的匿名内部类中,
access$000
方法提供对
privateMethod
的访问,谢谢!只是好奇,1美元(在你的例子中)和28美元(在我的例子中)代表什么?当前内存中该类的实例数@EasyAndSlow:不,它们不能这样做,因为它们是编译时数据的一部分。我相信它们是特定于实现的。。。可能是该类中匿名类的数量(在这种情况下,您有很多匿名类…)