>  기사  >  Java  >  Java 에이전트를 구현하는 방법은 무엇입니까? Java 에이전트 사용 사례 공유

Java 에이전트를 구현하는 방법은 무엇입니까? Java 에이전트 사용 사례 공유

php是最好的语言
php是最好的语言원래의
2018-07-27 09:46:211945검색

Java 에이전트를 구현하는 방법은 무엇입니까? 1. Java Agent를 구현하려면 premain 메소드를 구현해야 합니다. 2. MANIFEST.MF 파일에 Premain-Class가 있어야 합니다.

바이트코드 수준에서 클래스와 메소드를 수정하는 기술은 컴파일에 영향을 주지 않고 바이트코드를 수정할 수 있습니다. Spring의 AOP 기술

java Agent

의 역할을 이해할 수 있다. 바이트코드 수준에서 클래스와 메소드를 수정하는 기술로, 컴파일에 영향을 주지 않고 바이트코드를 수정할 수 있다. Spring의 AOP 기술을 이해할 수 있다

구현 방법

  1. javaagent를 구현하려면 premain 메소드를 구현해야 한다

  2. MANIFEST.MF 파일에 Premain-Class가 있어야 한다

demo 구현

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;
        }
    }

preload 클래스

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를 지정하는 방법에는 두 가지가 있습니다.
1) 명령줄 사용: java -javaagent:XXX.jar ddd.jar
2) 사용 아이디어의 VM 옵션.

Java 에이전트를 구현하는 방법은 무엇입니까? Java 에이전트 사용 사례 공유

관련 기사:

Java가 에이전트를 사용하여 기본 메서드를 구현하기 전의 코드 예

SQL Server SQL 에이전트 서비스 사용 튜토리얼 요약

관련 동영상:

최신 Java 전체 동영상 튜토리얼

위 내용은 Java 에이전트를 구현하는 방법은 무엇입니까? Java 에이전트 사용 사례 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.