Java Agent的agentmain和premain方式
https://www.yht7.com/news/30041
https://zhuanlan.zhihu.com/p/214093661 --jar跟cp的区别
Java Agent的agentmain和premain方式
作者:佚名 来源: 网络转载 时间:2020-03-14
首先假如我们有个应用1启动类为task,
package com.st;
import java.lang.instrument.Instrumentation;
import java.util.Scanner;
public class Task {
public static void main (String[] args) {
Scanner scanner = new Scanner(System.in);
scanner.hasNext();
}
}
需要执行的代码
package com.st;
import java.lang.instrument.Instrumentation;
public class AgentMainTest {
public static void agentmain(String agentArgs, Instrumentation inst){
System.out.println("打印全部加载的类:");
Class[] allLoadedClasses = inst.getAllLoadedClasses();
for (Class allLoadedClass : allLoadedClasses) {
System.out.println(allLoadedClass.getName());
}
}
}
maven打包配置:
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.st.Task</mainClass>
</manifest>
<manifestEntries>
<Agent-Class>
com.st.AgentMainTest
</Agent-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
打包成ks-demo-1.0-SNAPSHOT.jar,将其运行起来java -jar ks-demo-1.0-SNAPSHOT.jar
创建一个java类做应用2,导入jdk目录下的lib/tools.jar包,运行main方法
package com.st;
import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
import java.io.IOException;
/**
-
Hello world!
**/
public class App
{
public static void main( String[] args )
{try { //VirtualMachine 来自tools.jar // VirtualMachine.attach("9444") 9444为线程PID VirtualMachine vm = VirtualMachine.attach("9444"); //指定应用路径 vm.loadAgent("D:\work\ks-demo\target\ks-demo-1.0-SNAPSHOT.jar"); } catch (AttachNotSupportedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (AgentLoadException e) { e.printStackTrace(); } catch (AgentInitializationException e) { e.printStackTrace(); }
}
}
该功能多用于收集系统信息,以及在系统加载后对class文件重新编辑等功能。
premain方式
package com.st;
public class Task {
public static void main (String[] args) {
System.out.println("mian执行");
}
}
package com.st;
import java.lang.instrument.Instrumentation;
public class AgentMainTest {
public static void premain(String agentArgs, Instrumentation inst){
System.out.println("premain执行:");
}
}
maven-jar-plugin 3.0.2 true com.st.Task com.st.AgentMainTest 运行命令:java -javaagent:ks-demo-1.0-SNAPSHOT.jar -jar ks-demo-1.0-SNAPSHOT.jar运行结果:
premain在应用加载前执行,通常用于加载重新编辑类
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。