首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java热点服务代理SystemDictionary.ClassVisitor自JDK11以来不可用

Java热点服务代理SystemDictionary.ClassVisitor自JDK11以来不可用
EN

Stack Overflow用户
提问于 2021-10-05 09:28:18
回答 1查看 197关注 0票数 0

我正在尝试构建一个非常基本的Java Hotspot服务代理,以转储一个特定加载方法的字节码。这是我经纪人的代码:

代码语言:javascript
复制
package sun.jvm.hotspot.jdi;

import sun.jvm.hotspot.oops.InstanceKlass;
import sun.jvm.hotspot.oops.Method;
import sun.jvm.hotspot.oops.Klass;
import sun.jvm.hotspot.memory.SystemDictionary;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;

public class GetBytecode extends Tool {

    @Override
    public void run() {
        VM.getVM().getSystemDictionary().allClassesDo(new SystemDictionary.ClassVisitor() {
            public void visit(Klass klass) {
                if (klass.getName().asString().equals("MyDebugger")) {
                    Method method = ((InstanceKlass) klass).findMethod("sendMessage", "()V");
                    for (byte bc : method.getByteCode()) {
                        System.out.printf("%02x ", bc);
                    }
                }
            }
        });
    }

    public static void main(String[] args) {
        new GetBytecode().execute(args);
    }
}

我用下面的行编译了它:

代码语言:javascript
复制
javac --add-modules=jdk.hotspot.agent --add-exports "jdk.hotspot.agent/sun.jvm.hotspot.memory.SystemDictionary=ALL-UNNAMED" --add-exports "jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED" --add-exports "jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED" --add-exports "jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED"  --add-exports  "jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED" --add-exports "jdk.hotspot.agent/sun.jvm.hotspot.classfile=ALL-UNNAMED" *.java

它修复了我以前遇到的导入问题,但是似乎因为JDK11 SystemVisitor.ClassVisitor接口已经不存在了,因为我在编译时得到一个错误:

代码语言:javascript
复制
GetBytecode.java:14: error: cannot find symbol
        VM.getVM().getSystemDictionary().allClassesDo(new SystemDictionary.ClassVisitor() {
                                                                          ^
  symbol:   class ClassVisitor
  location: class SystemDictionary
1 error

而且,我在网上找不到任何医生,这太令人沮丧了.见javadoc

SystemDictionary in JDK8

SystemDictionary in JDK11

欢迎使用任何修复/解决方法:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-05 10:21:48

jdk.hotspot.agent是JDK内部模块,不是任何标准的一部分,不适合最终用户,因此没有文档化。

因此,即使在一个小小的JDK更新中,也可以任意更改该模块的API。为JDK的一个版本编写的代码不需要与其他JDK版本兼容。这一点是非常理解的,因为Serviceability反映了内部JVM结构,这些结构可能会在不同版本之间更改(并进行更改)。

因此,您需要为JDK 11编写不同的代码。

代码语言:javascript
复制
import sun.jvm.hotspot.oops.InstanceKlass;
import sun.jvm.hotspot.oops.Method;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;

public class GetBytecode extends Tool {

    @Override
    public void run() {
        VM.getVM().getSystemDictionary().sharedDictionary().allEntriesDo((klass, loader) -> {
            if (klass.getName().asString().equals("MyDebugger")) {
                Method method = ((InstanceKlass) klass).findMethod("sendMessage", "()V");
                for (byte bc : method.getByteCode()) {
                    System.out.printf("%02x ", bc);
                }
            }
        }, null);
    }

    public static void main(String[] args) {
        new GetBytecode().execute(args);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69447986

复制
相关文章

相似问题

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