【 전 】 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   이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.