2017-04-17 108 views
0

得到的值我有一個類Normal用下面的代碼:如何設置/從另一個JVM

public class Normal { 

    private static String myStr = "Not working..."; 
    private static boolean running = true; 

    public static void main(String[] args) { 
     while(running) { 
      System.out.println(myStr); 
     } 
    } 

} 

而且我已經在另一個項目名爲Injector另一個類。其目的是,即使他們並不在同一個JVM改變Normal值:分別

public class Injector { 

    public static void main(String[] args) { 
    String PID = //Gets PID, which works fine 

    VirtualMachine vm = VirtualMachine.attach(PID); 

    /* 
    Set/Get field values for classes in vm? 
    */ 

    } 
} 

我想要做的就是更改類NormalmyStrrunning"Working!"false不改變代碼Normal(僅在Injector)。

在此先感謝

+1

我想你讀過[的虛的的JavaDoc](https://docs.oracle.com/javase/8/docs/jdk/api/attach/spec/com/sun/tools/attach/ VirtualMachine.html)和那裏的例子。您的'Injector'現在可以將一個代理程序(一個已經編譯成單獨的.jar文件的程序)加載到附加的JVM中。 – Hulk

+0

[儀器包的JavaDocs](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html?is-external=true)包含很多有關代理人需要工作以及如何完成特定事情的信息。 – Hulk

回答

0

你需要兩個JAR:

  1. 一是Java Agent使用反射改變字段值。 Java代理的主類應該有agentmain入口點。

    public static void agentmain(String args, Instrumentation instr) throws Exception { 
        Class normalClass = Class.forName("Normal"); 
        Field myStrField = normalClass.getDeclaredField("myStr"); 
        myStrField.setAccessible(true); 
        myStrField.set(null, "Working!"); 
    } 
    

    你必須添加MANIFEST.MFAgent-Class屬性和包裝代理到一個JAR文件。

  • 第二個是使用動態連接以注射劑罐到正在運行的VM的實用程序。假設pid是目標Java進程ID。

    import com.sun.tools.attach.VirtualMachine; 
    ... 
    
        VirtualMachine vm = VirtualMachine.attach(pid); 
        try { 
         vm.loadAgent(agentJarPath, ""); 
        } finally { 
         vm.detach(); 
        } 
    

    the article瞭解更多詳情。

  • 相關問題