Студенты, которые занимаются Java-разработкой, более или менее слышали об этом.java探针
/javaagent
этот термин. В этой статье не говорится о его определении, его принципе или его роли в величии, а только о его «привет, мир». То есть запустите простейший пример, реально увидите эффект и получите реальное и четкое понимание для быстрого входа и углубленного изучения.
кодирование
Создайте проект maven с идеей, как показано ниже, имя проекта произвольное, здесь имя моего проекта: microservice-comb-javaagent
код показывает, как показано ниже Сначала создайте класс: AgentDemo
public class AgentDemo {
/**
* 该方法在main方法之前运行,与main方法运行在同一个JVM中
*/
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("------ premain方法 有两个入参 ------ agentArgs:" + agentArgs + " inst:" + inst.toString());
}
/**
* 如果不存在 {@link AgentDemo#premain(String, Instrumentation)}, 则会执行本方法
*/
public static void premain(String agentArgs) {
System.out.println("------ premain方法,有一个入参 ------ agentArgs:" + agentArgs);
}
}
Примечание. Полное имя AgentDemo будет помечено в pom.xml.Premain-Class
Цитировать
Во-вторых, создайте еще один класс: AgentTest.
public class AgentTest {
public static void main(String[] args) {
System.out.println(" ------ main方法");
}
}
Опять же, в pom.xml проекта добавьте
··· 略
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<!-- 值为包含premain方法的类. 启动方式为命令行启动时,javaagent JAR文件清单必须包含 Premain-Class 属性, 代理类必须实现 public static premain()-->
<Premain-Class>com.skyler.cobweb.agent.AgentDemo</Premain-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
баночка пакет
будетmicroservice-comb-javaagent
отметкаjar
Мешок. Среда выполнения будет использовать этоJar
пакет Команда пакета:mvn clean package
. Результат выглядит следующим образом
бегать
У вас может быть два режима работы:idea中直接运行
а также命令行运行
- запустить прямо в идею
Конфигурация запуска проекта должна быть настроенаVM options
, как показано на рисунке ниже, в виде-javaagent:jarpath[=options]
; мой контент:-javaagent:/Users/xx/microservice-comb/microservice-comb-javaagent/target/microservice-comb-javaagent-1.0.0-SNAPSHOT.ar="hello world"
Затем запустите метод AgentTest.main, и результат будет следующим:
Как видите, выводится информация о методе AgentDemo.premain.
- запуск командной строки
cd
Перейдите по пути /target/classes проекта microservice-comb-javaagent.
$ cd xx/target/classes
$ java -javaagent:/Users/xx/microservice-comb/microservice-comb-javaagent/target/microservice-comb-javaagent-1.0.0-SNAPSHOT.jar="hello world" com.skyler.cobweb.agent.AgentTest
Как видите, информация метода AgentDemo.premain также выводится на печать.
награда
Вот сравнение, нужно ли добавлять во время выполнения-javaagent:jar
, ощущение, которое это дает вам, будет очевидным и тщательным. давай еще
плюс время
$ cd /Users/xx/microservice-comb/microservice-comb-javaagent/target/classes
$ java -javaagent:/Users/xx/microservice-comb/microservice-comb-javaagent/target/microservice-comb-javaagent-1.0.0-SNAPSHOT.jar="hello world" com.skyler.cobweb.agent.AgentTest
Эффект
------ premain方法 有两个入参 ------ agentArgs:hello world inst:sun.instrument.InstrumentationImpl@a09ee92
------ main方法
без времени
$ cd /Users/xx/microservice-comb/microservice-comb-javaagent/target/classes
$ java com.skyler.cobweb.agent.AgentTest
Эффект
------ main方法
Эффект все равно очевиден.Без -javaagent метод класса в jar не выполняется, то есть никакой информации не выводится.
Цель этого сравнения — подчеркнуть роль javaagent. И позвольте вам ясно почувствовать роль javaagent: как агент, вы можете сделать что-то перед основным методом, официально заявленным улучшением байт-кода. Изменяя байт-код, разработчики получают возможность делать такие вещи, как встроенные компоненты мониторинга Arthas и Skywalking.
тысяча словrun
"привет мир"
В этой статье мы хотим использовать самый простой и интуитивно понятный способ, чтобы дать вам самое быстрое и реалистичное понимание роли javaagent. Следующая статья раскрывает принцип работы javaagent и более практические примеры использования.