【 전 】 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에 따라 라이센스가 부여됩니다.