1

我正在查看 Javap 的输出。例如:

这段代码

    final Foo foo = new Foo(1,2);
    ... 
    new Callable<Integer>()
    {
        @Override
        public Integer call() throws Exception
        {
            return foo.doSomething();
        }

生成:

        jvmOperations": [{
            "byteOffset": 0,
            "constantPoolIndex": null,
            "opCode": 42,
            "opCodeName": "aload_0",
            "type": null,
            "tagName": null,
            "tagValue": null
        }, {
            "byteOffset": 1,
            "constantPoolIndex": null,
            "opCode": 180,
            "opCodeName": "getfield",
            "type": null,
            "tagName": "Field",
            "tagValue": "val$foo:Lcom/example/graph/demo/Foo;"
        }, {
            "byteOffset": 4,
            "constantPoolIndex": null,
            "opCode": 182,
            "opCodeName": "invokevirtual",
            "type": null,
            "tagName": "Method",
            "tagValue": "com/example/graph/demo/Foo.doSomething:()Ljava/lang/Integer;"
        }, {
            "byteOffset": 7,
            "constantPoolIndex": null,
            "opCode": 176,
            "opCodeName": "areturn",
            "type": null,
            "tagName": null,
            "tagValue": null
        }]

所以我看到在这种情况下该对象由val$foo. 并在类元数据中

    "classMetaData": {
        "classId": "com/example/Main$1.class",
        "sourceName": "Main.java",
        "isInterface": false,
        "isClass": true,
        "accessModifiers": ["final"],
        "superClassName": "java/lang/Object",
        "implementedInterfaces": ["java/util/concurrent/Callable"],
        "jreTargetVersion": "51.0",
        "fields": ["val$foo"],
        "fieldModifiers": {
            "val$foo": ["final"]
        },
        "methodInformationMap": {},
        "interface": false,
        "class": true
    }, 

但现在我想了解更多关于原始对象的信息foo。例如,我知道它在其中一个字段中有这些数据:

        {
            "byteOffset": 37,
            "constantPoolIndex": null,
            "opCode": 18,
            "opCodeName": "ldc",
            "type": null,
            "tagName": "String",
            "tagValue": "NODE-1"
        }, 

JVM如何知道val$foo指向什么?

4

1 回答 1

2

您需要更多上下文来跟踪 JVM 存储的值foo

假设foo是一个局部变量

  1. new Foo(1,2);被调用
  2. 结果,实例引用的值,被复制并存储在局部变量中foo
  3. ...东西...
  4. 调用匿名类构造函数来创建一个新实例
  5. 作为其构造函数的一部分,foo检索局部变量值的副本并将其压入堆栈
  6. 该值从堆栈中弹出并分配给val$foo匿名类的此字段(这是关闭该变量)
  7. ...东西...
  8. 被调用时,JVM获取匿名类实例foo.something()的字段值val$foo
  9. JVM 取消引用该值以获取对象并调用其上的方法
于 2014-10-22T00:11:00.640 回答