私が知っているだろうハロー世界を実行することです何javaagent分かりません

学生のJava開発は多かれ少なかれ聞いたに従事java探针/ javaagentこの用語。この記事では、それが「こんにちは世界」だだけで、背の高いの役割ではない、定義はそれが原則だと言うしないことを言っていません。最も単純な例の実行1は、実際の結果を見て、本当の気持ちは、本当に入り口をクリアすることができます。

コーディング

以下に示すようにランダムで、プロジェクト名を考えとMavenのプロジェクトを作成し、ここで私はプロジェクトと呼ばれる:microservice-櫛javaagent

20200310194628.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

ラン

あなたは、2つの動作モードを持つことができます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

  • 実行するコマンドラインcdmicroservice-くし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ことなく、明らかです

この比較の目的は、javaagent役割を強調することです。そして、あなたの気持ち明確な役割javaagentを聞かせて:エージェントはメインメソッドの前に同じことを行うことができますように、公式には、バイトコードの強化が言いました。このようskywalking建てArthasは、モニタコンポーネントとして開発者に何かをする機会を可能にバイトコードを、変更することによって

Aではない価値がある千個の言葉run"ハロー世界

この記事ではjavaagentの役割のあなたの最も速く、最も現実の理解を維持するための最も簡単で直感的な方法をしたいです。パートIIは言うのjavaagentの原則と使用のより実用的な例を拡大します

おすすめ

転載: juejin.im/post/5e67933e51882549315fc4ec