Я не знаю, что такое javaagent, просто запустите hello world, чтобы узнать

Java
Я не знаю, что такое javaagent, просто запустите hello world, чтобы узнать

Студенты, которые занимаются Java-разработкой, более или менее слышали об этом.java探针/javaagentэтот термин. В этой статье не говорится о его определении, его принципе или его роли в величии, а только о его «привет, мир». То есть запустите простейший пример, реально увидите эффект и получите реальное и четкое понимание для быстрого входа и углубленного изучения.

кодирование

Создайте проект maven с идеей, как показано ниже, имя проекта произвольное, здесь имя моего проекта: microservice-comb-javaagent20200310194628.png

код показывает, как показано ниже Сначала создайте класс: 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. Результат выглядит следующим образом20200310200510.png

бегать

У вас может быть два режима работы: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"

20200310211044.png

Затем запустите метод AgentTest.main, и результат будет следующим:20200310201519.png

Как видите, выводится информация о методе 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 также выводится на печать.20200310203649.png

награда

Вот сравнение, нужно ли добавлять во время выполнения-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 и более практические примеры использования.