ホームページ  >  記事  >  Java  >  Javaエージェントを実装するにはどうすればよいですか? Javaエージェントのユースケースを共有する

Javaエージェントを実装するにはどうすればよいですか? Javaエージェントのユースケースを共有する

php是最好的语言
php是最好的语言オリジナル
2018-07-27 09:46:211907ブラウズ

Javaエージェントを実装するには? 1. Java エージェントを実装するには、premain メソッドを実装する必要があります。2. MANIFEST.MF ファイルに Premain-Class が存在する必要があります。

クラスやメソッドをバイトコードレベルで変更する技術により、コンパイルに影響を与えることなくバイトコードを変更できます。 Springのaop技術の役割がわかる

javaエージェント

コンパイルに影響を与えずにバイトコードを変更できる、バイトコードレベルでクラスやメソッドを変更する技術。 SpringのAOP技術を理解できる

実装方法

  1. javaagentを実装するには、premainメソッドを実装する必要がある

  2. MANIFEST.MFファイルにPremain-Classが存在する必要がある

デモ実装

agent

  package com.xueyou.demo.agent;
     
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtMethod;
    import javassist.CtNewMethod;
     
    import java.lang.instrument.ClassFileTransformer;
    import java.lang.instrument.IllegalClassFormatException;
    import java.security.ProtectionDomain;
     
    public class FirstAgent implements ClassFileTransformer {
        public final String injectedClassName = "com.xueyou.agentdemo.App";
        public final String methodName = "hello";
     
        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            className = className.replace("/", ".");
    //        System.out.println(className);
            if (className.equals(injectedClassName)) {
                CtClass ctclass = null;
                try {
                    ctclass = ClassPool.getDefault().get(className);// 使用全称,用于取得字节码类<使用javassist>
                    CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);// 得到这方法实例
                    ctmethod.insertBefore("System.out.println(11111111);");
                    return ctclass.toBytecode();
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
            }
            return null;
        }
    }

プリロードクラス

package com.xueyou.demo;
 
import com.xueyou.demo.agent.FirstAgent;
 
import java.lang.instrument.Instrumentation;
 
/**
 * Hello world!
 */
public class App {
    public static void premain(String agentOps, Instrumentation inst) {
        System.out.println("=========premain方法执行========");
        System.out.println(agentOps);
        // 添加Transformer
        inst.addTransformer(new FirstAgent());
    }
}

mavenはプリロードクラスを指定します

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <manifestEntries>
                                       <PremainClass>com.xueyou.demo.App</Premain-Class>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

使い方

javaagentを指定するには2つの方法があります:
1) コマンドラインを使用します: java -javaagent:XXX.jar ddd.jar
2) を使用しますアイデアの vm オプション。

Javaエージェントを実装するにはどうすればよいですか? Javaエージェントのユースケースを共有する

関連記事:

Java がエージェントを使用して main メソッドを実装する前のコード例

SQL Server SQL Agent サービスの使用方法チュートリアルの概要

関連ビデオ:

最新の Java 完全なビデオ チュートリアル

以上がJavaエージェントを実装するにはどうすればよいですか? Javaエージェントのユースケースを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。