首页 > 编程语言 >创建一个 java agent jar 包

创建一个 java agent jar 包

时间:2023-11-08 10:22:53浏览次数:42  
标签:code java name jar agent org public String

  1. pom.xml 文件。(javaagent 和 main 方法的 jar 可以分开成两个项目,单独打包 jar)
<?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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>app</artifactId>
    <packaging>jar</packaging>
    <version>0.1</version>

    <dependencies>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.25.0-GA</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>org.example.MainApp</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifestEntries>
                            <Premain-Class>org.example.MyAgent</Premain-Class>
                            <Agent-Class>org.example.MyAgent</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>
  1. 创建 premain 方法,方法的主要功能是修改 App setName() 方法体
public class MyAgent {
    public static void premain(String args, Instrumentation inst) {
        MyTransformer tran = new MyTransformer();
        inst.addTransformer(tran);
    }
}

public class MyTransformer implements ClassFileTransformer {

    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        if ("org/example/App".equals(className)) {
            try {

                // 从ClassPool获得CtClass对象
                final ClassPool classPool = ClassPool.getDefault();
                final CtClass clazz;
                clazz = classPool.get("org.example.App");

                CtMethod convertToAbbr = clazz.getDeclaredMethod("setName");
                String methodBody = "{\n" +
                        "        this.name = \"ccc\" + \" aaa\";\n" +
                        "    }";
                convertToAbbr.setBody(methodBody);

                byte[] byteCode = clazz.toBytecode();
                clazz.detach();
                return byteCode;
            } catch (NotFoundException | CannotCompileException | IOException e) {
                e.printStackTrace();
            }
        }

        System.out.println(className);
        return classfileBuffer;
    }

}

public class App {
    private int code;
    private String name;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "App{" +
                "code=" + code +
                ", name='" + name + '\'' +
                '}';
    }
}

public class MainApp {

    public static void main(String... args) throws Exception {
        App app = new App();
        app.setName("a");
        app.setCode(123);
        System.out.println(app);
    }

}
  1. 启动 javaagent
java -javaagent:app-0.1-jar-with-dependencies.jar -jar app-0.1.jar

控制台输出
App{code=123, name='ccc aaa'}
name 属性被成功修改

标签:code,java,name,jar,agent,org,public,String
From: https://www.cnblogs.com/iyiluo/p/17816766.html

相关文章

  • javascript 手动实现 bind,call,apply
     js手动实现call方法Function.prototype.myCall=function(content,...args){letmyfn=Symbol()content=content||globalThis//console.log(content)content[myfn]=this//console.log(content)constresu......
  • Java面试题(高频、有答案,全网最强)
    这是一套全网最强的Java面试题,吊打网上所有Java面试题。此套面试题的威力:看过这套题的朋友、同事、粉丝参加了面试后说,他们面试被问到的问题大部分(85%以上)都在这套题里,面试通过率高达90%。这是粉丝的真实评价(聊天截图):有人说这套题题目太多了,我说:着急的可以看频率为两颗星及以上的题......
  • Java学习—Java修饰符
    Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符1、访问控制修饰符Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。default (即默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、......
  • Java连接服务器的两种方式SFTP和FTP
    https://www.jb51.net/article/276407.htm在项目开发中,一般文件存储很少再使用SFTP服务,但是也不排除合作伙伴使用SFTP来存储项目中的文件或者通过SFTP来实现文件数据的交互,这篇文章主要介绍了Java集成FTP与SFTP连接池−目录区别FtpUtilSFTPUtil问题区别FTP是一种文件传输协议,一般是......
  • JAVA开发(JAVA架构师成长之路)
    从一个最基础的JAVA开发人员成为JAVA架构师,需要经历8层能力的进阶。第一阶段:熟悉JAVA基础语法,学会写各种ifelse和流程语句,熟练使用各种数据类型,集合。能依葫芦画瓢,模仿别人的代码结构,新增类,修改类的信息和逻辑。这个阶段大概是一年的经验。第二阶段:熟悉使用各种开源组件,比如知......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • Java 注释
    单行注释://多行注释:/**/文档注释:/**回车设置单行注释多行注释文档注释的颜色:File→Settings→ColorScheme→Java→Cmomentslinecomment单行注释blockcomment注释区块(多行注释) JavaDoc文档注释 ......
  • Java异常处理
    三.Java异常处理(1)什么是异常?异常就是代表程序出现的问题。Java会将异常封装成一个异常对象,抛给JVM虚拟机,JVM虚拟机会将程序暂停再将异常对象打印出来。(2)异常的体系所有异常都继承了Throwable类。Error:代表的系统级别错误(属于严重问题),一般开发人员用不到,属于是sun公司自己用......
  • JavaScript--变量和数据类型
    使用var声明变量vartest=20;test="张三";变量可以存放不同类型的值var定义域分布在全局并且可以重复定义letlet关键字所在的代码块内有效JavaScript中分为:原始类型和引用类型5种原始类型number:数字,整数或者小数string:字符、字符串boolean:布尔null:空undefined:......
  • 【JavaScript】事件轮询
    1、先参考搞懂JavsScript异步— 事件轮询2、明确几点:setTimeout、DOMEvent、HttpRequest、setInterval、setImmediate(Node.js独有)的回调、I/O操作、UI渲染均会被加载到消息队列(macrotask宏任务)。Promise的回调、MutationObserver、process.nextTick(Node.js独有)会被加......