【 전 】 Java SE 6 새로운 기능: Instrumentation 2

Java SE 6   :Instrumentation
    http://dev.yesky.com/344/3488344_2.shtml

  Java SE 6     :          instrument

    Java SE 5   ,       premain        ,    Instrumentation      main      ,             。

    Java SE 5     ,Java SE 6            ,       main         ,       Instrumentation   。

    Java SE 6   Instrumentation   ,     premain“    ” “agentmain”  ,    main            。

    premain     ,            “agentmain”    Java  :

public static void agentmain (String agentArgs, Instrumentation inst); [1]
public static void agentmain (String agentArgs); [2]

    ,[1]       [2]  ,       。

    premain     ,       agentmain           。    agentArgs   Inst      premain   。

   “Premain-Class”  ,       manifest       “Agent-Class”      agentmain     。

    ,  premain     ,agentmain     main           ,            ,           ?

    Java SE 6     ,         java.lang.instrument                ,            agnetmain    。  ,  Java SE 6       ,          ,    agentmain    。    Java SE 6       Attach API。

  Attach API    Java     API,   Sun           API,      JVM ”  ”(Attach)       。   ,             JVM,           。

  Attach API    ,   2      ,   com.sun.tools.attach    : VirtualMachine      Java    ,               ,    JVM   ,Attach     Detach   (Attach        ,  JVM      ??? ??    )  ; VirtualMachineDescriptor              ,   VirtualMachine        。

        ,        :           ,      1          2    ,Attach API         ,        ,              Java    ,              ,    attach   ,      Attach API             Jar   。   5      ,attach       。   main     ,              (        1    2)。

  TransClass    Transformer       ,       。    main     TestMainInJar    :

public class TestMainInJar {
 public static void main(String[] args) throws InterruptedException {
  System.out.println(new TransClass().getNumber());
  int count = 0;
  while (true) {
   Thread.sleep(500);
   count++;
   int number = new TransClass().getNumber();
   System.out.println(number);
   if (3 == number || count >= 10) {
    break;
   }
  }
 }
}

     agentmain   AgentMain      :

import java.lang.instrument.ClassDefinition;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;

public class AgentMain {
 public static void agentmain(String agentArgs, Instrumentation inst)
 throws ClassNotFoundException, UnmodifiableClassException,
 InterruptedException {
  inst.addTransformer(new Transformer (), true);
  inst.retransformClasses(TransClass.class);
  System.out.println("Agent Main Done");
 }
}

    ,retransformClasses   Java SE 6       ,   redefineClasses   ,         ,    agentmain   。

  Jar     Premain         Jar      ,    main   agentmain   ,TransClass,Transformer       ,   “TestInstrument1.jar”,  Jar       Manifest    :

Manifest-Version: 1.0
Agent-Class: AgentMain

    ,     Attach API,                   :(    )

import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
……
//      Attach API      
static class AttachThread extends Thread {
 private final List<VirtualMachineDescriptor> listBefore;
 private final String jar;
 AttachThread(String attachJar, List<VirtualMachineDescriptor> vms ) {
  listBefore = vms; //          VM   
  jar = attachJar;
 }

 public void run() {
  VirtualMachine vm = null;
  List<VirtualMachineDescriptor> listAfter = null;
  try {
   int count = 0;
   while (true) {
    listAfter = VirtualMachine.list();
    for (VirtualMachineDescriptor vmd : listAfter) {
    if (!listBefore.contains(vmd)) { 
     //    VM    ,           VM    
     //   ,         VM
     vm = VirtualMachine.attach(vmd);
     break;
    }
   }
   Thread.sleep(500);
   count++;
   if (null != vm || count >= 10) {
    break;
   }
  }
  vm.loadAgent(jar);
  vm.detach();
 } catch (Exception e) {
  ignore
 }
}
}
……
public static void main(String[] args) throws InterruptedException { 
 new AttachThread("TestInstrument1.jar", VirtualMachine.list()).start();
}

     ,                 main   ,  ,  5    (       JVM      )           Jar   :

java –javaagent:TestInstrument2.jar –cp TestInstrument2.jar TestMainInJar

              ,            1,          ,        2,     agentmain     Attach API       JVM  ,       ,  ,     “Agent Main Done”     。

              ,          。           ,                JVM   

좋은 웹페이지 즐겨찾기