Java利用Attach机制与Agent

2020-07-10  本文已影响0人  逆风踏雷

1.首先启动一个tomcat,jps查看进程。


image.png

2.编写agent并打包。

package agent;

import java.lang.instrument.Instrumentation;

/**
 * @author qishaojun
 */
public class TestAgent {
//    public static void premain(String agentArgs, Instrumentation inst) {
//        System.out.println("premain start ...");
//        System.out.println(agentArgs);
//    }

    public static void agentmain(String args, Instrumentation inst) {
        System.out.println("loadagent after main run.args=" + args);
        Class<?>[] classes = inst.getAllLoadedClasses();
        for (Class<?> cls : classes) {
            System.out.println(cls.getName());
        }
        System.out.println("agent run completely");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sjqi.test</groupId>
    <artifactId>agent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <!--                            <Premain-Class>-->
                            <!--                                agent.TestAgent-->
                            <!--                            </Premain-Class>-->
                            <Agent-Class>
                                agent.TestAgent
                            </Agent-Class>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

maven 配置是为了确保jar包打出来的MANIFEST.MF是这样的

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: MC
Build-Jdk: 1.8.0_191
Agent-Class: agent.TestAgent


3.编写操纵程序

//maven引入
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.8.0</version>
            <scope>system</scope>
            <systemPath>C:/Program Files/Java/jdk1.8.0_191/lib/tools.jar</systemPath>
        </dependency>
//代码编写
package com.sprucetec.pop;


import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;

import java.io.IOException;

/**
 * @author qishaojun
 */
public class TestAgent {
    public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException {
        VirtualMachine vm=VirtualMachine.attach("2192");
        vm.loadAgent("D:/pop-space/agent/target/agent-1.0-SNAPSHOT.jar");
    }
}

4.运行效果在tomcat的控制台


image.png
上一篇下一篇

猜你喜欢

热点阅读