在執行時新增代理

可以在執行時將代理新增到 JVM。要載入代理,你需要使用 Attach API 的 VirtualMachine.attatch(String id) 。然後,你可以使用以下方法載入已編譯的代理程式 jar:

public static void loadAgent(String agentPath) {
    String vmName = ManagementFactory.getRuntimeMXBean().getName();
    int index = vmName.indexOf('@');
    String pid = vmName.substring(0, index);
    try {
        File agentFile = new File(agentPath);
        VirtualMachine vm = VirtualMachine.attach(pid);
        vm.loadAgent(agentFile.getAbsolutePath(), "");
        VirtualMachine.attach(vm.id());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

這不會在載入的代理中呼叫 premain((String agentArgs,Instrumentation inst) ,而是呼叫 agentmain(String agentArgs,Instrumentation inst) 。這需要在代理 Manifest.mf 中設定 Agent-Class