`

javaagent初探

    博客分类:
  • java
阅读更多
    业务开发过程中,经常需要利用maven,将代码进行打包成jar包的形式在服务器上进行运行。但是在打包过程中,maven会将所有的依赖都打进包内,不管有些递归依赖是不必要的 ,虽然我们可以利用 mvn dependence:tree 命令得到所有的依赖图,再通过在pom.xml文件中进行exclusion的标签将依赖除去,但是这种方法第一需要大量的人工校验,第二不能很准确的找出不需要的依赖文件,大部分是需要依赖直觉,所以会浪费很多时间,在此情况下,准备做一个jvm级别的工具,通过对类加载进jvm的过程进行监控,得到所有需要的类的方式,从而准确的进行对jar包的压缩。
    言归主题,在确定了需求以及大致思路后,在进行准备的过程中,发现了一个javaagent的东西,可以有效的完成我们的需求。
什么是javaagent呢?
    顾名思义,javaagent是一个对java进行代理的东西,找到一段我觉得较准确的描述
引用
javaagent是一种能够在不影响正常编译的情况下,修改字节码。java作为一种强类型的语言,不通过编译就不能能够进行jar包的生成。而有了javaagent技术,就可以在字节码这个层面对类和方法进行修改。同时,也可以把javaagent理解成一种代码注入的方式。但是这种注入比起spring的aop更加的优美。

    在我简单操作之后,对这个东西的理解就是,他是一个字节码层面的类的加强器,即可以在不改变类的情况下,附加一些我们需要增加的功能。
如何使用javaagnet呢,有两个条件,第一,实现一个premain方法,第二在打包时,明确实现premain方法的 类。
    在将自定义的agent进行打包后,可以看到jar包的内容为
Manifest-Version: 1.0
Premain-Class: ClassAgent
Built-By: .
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_111

    即有指定preclass的类,这就可以作为javaagent的工具包了。
具体使用方法就是,在执行我们的代码是,在启动参数上添加 -javaagent:{path-to-our-agent.jar},替换进我们agent工具包的地址就行,这样我们就可以看到在执行真正代码前,先执行了我们的premain方法,这也就是为什么叫pre-main了^-^

    太迟了,随便写了一个demo实验了一下
   
public class ClassAgent {
    public static void premain(String agentOps, Instrumentation instrumentation) {
        System.out.println("---------start agent-------------");
        System.out.println(agentOps);
        instrumentation.addTransformer(new ClassTransformer());
    }
}

public class ClassTransformer implements ClassFileTransformer {
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        public class ClassTransformer implements ClassFileTransformer {
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        System.out.println(className.replace('/','.'));
        return new byte[0];
    }
}
        return new byte[0];
    }
}

再在pom.xml文件里注册premain的class
<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Premain-Class>ClassAgent</Premain-Class>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

最后,将这个项目打包,并将jar包位置作为参数,传入实际执行代码的启动参数中,并启动
看到console输出

离目标前进了一小步,睡觉

  • 大小: 251.8 KB
分享到:
评论
4 楼 粟谷_sugu 2018-04-21  
jocks 写道
小粉丝评论下

大佬,你是谁啊
3 楼 粟谷_sugu 2018-04-21  
ZJKAICO 写道
工具打算什么时候写完?

本季度kpi啊。。
2 楼 jocks 2018-04-21  
小粉丝评论下
1 楼 ZJKAICO 2018-04-21  
工具打算什么时候写完?

相关推荐

    java agent注册为windows服务

    wrapper.java.additional.1=-javaagent:path/to/your/agent.jar ``` 6. **启动服务**:现在,当JSW启动Java应用程序时,它会先加载我们的Java Agent,然后由Agent完成服务注册。之后,你可以通过Windows服务管理...

    java agent使用全解析

    当Java虚拟机启动时,在执行main函数之前,JVM会先运行-javaagent所指定jar包内Premain-Class这个类的premain方法。 java agent的主要作用是提供了一个Class类型的转换器,可以在运行时接受重新外部请求,对Class...

    java JAVA_OPTS javaagent

    标题中的"java JAVA_OPTS javaagent"涉及到Java应用程序的启动参数设置,特别是`JAVA_OPTS`环境变量和`javaagent`选项,这两个是Java虚拟机(JVM)启动时的关键配置项。`JAVA_OPTS`通常用于传递额外的JVM参数,如...

    java项目实现热更源码-javaagent

    2. **指定Agent参数**:在Java应用启动时,通过`-javaagent`参数指定Agent的路径和可选参数。例如:`-javaagent:/path/to/your/agent.jar=param1=value1,param2=value2`。 3. **操作类字节码**:Java Agent接收到...

    java 代理例子 -javaagent,premain方式实现

    在这个包中,`javaagent`接口是关键,它定义了一个`premain`方法,该方法会在目标应用程序启动之前被调用,允许我们在程序加载时进行干预。 `premain`方法的签名如下: ```java public static void premain(String ...

    javaagent使用指南-rickiyang1

    Javaagent 是一种强大的工具,它允许开发者在 Java 程序运行时动态地修改类的行为。这个特性在很多场景下非常有用,比如性能监控、代码覆盖率分析、动态代理等。在本文中,我们将深入探讨 Javaagent 的使用以及其...

    jmx_prometheus_javaagent-0.12.0.jar

    代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar

    JADE(Java Agent DEvelopment Framework):一个Agent,多Agent系统的开发框架

    在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...

    基于Bytebuddy的Java Agent AOP框架.zip

    Java Agent是一种在JVM级别对程序进行动态增强的技术,它允许我们无需修改源代码或重新编译就可以在运行时对类进行拦截、修改或者增强。ByteBuddy是Java的一个库,用于在运行时创建和修改Java类和接口,它是创建Java...

    java-agent演示项目,修改Java源代码_java-agent-demo.zip

    java-agent演示项目,修改Java源代码_java-agent-demo

    JavaAgent:Javassist 与 Asm JavaAgent 字节码动态编程项目

    在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM这两个库来实现JavaAgent。 首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行...

    snmp java agent工具

    1. **SNMP Java Agent**: Java SNMP Agent是用Java语言编写的SNMP协议实现,它使得开发者能够在Java平台上构建符合SNMP标准的网络管理应用。Java SNMP库通常提供API,用于创建MIB对象、处理GET、SET和TRAP请求,以及...

    idea maven 搭建java agent项目,手把手教你实现方法耗时统计的java agent.zip

    使用`-javaagent`参数指定你的Agent jar路径,以及`premain`方法的参数,如果有的话。 7. **收集和展示数据**:在Agent中,你需要实现数据的收集和展示。这可能包括将统计信息记录到日志文件,或者通过Socket发送到...

    Java Agent源码(带Jar包)

    在源码中,我们可能会看到如何注册和使用Java Agent的示例,这通常涉及到`-javaagent`命令行参数的使用,以及`Premain-Class`和`Agent-Class` manifest条目的配置。同时,源码可能包含如何利用Instrumentation API来...

    apache-skywalking-java-agent-8.9.0

    在这个"apache-skywalking-java-agent-8.9.0"版本中,我们将探讨这个Java代理如何监控JVM服务,并深入理解其相关知识点。 1. **SkyWalking Java Agent**:SkyWalking的Java代理是一个自动探针,可以无侵入地附加到...

    javaAgent实现补丁不重出功能,通过attach实现程序运行时加载,同时通过shell脚本部署到容器内

    JavaAgent是一种强大的技术,它允许在Java应用程序运行时对其进行拦截和修改,而无需停止或重新启动应用。在本文中,我们将深入探讨如何利用JavaAgent来实现补丁的动态加载,以及如何通过shell脚本将其部署到容器...

    Minecraft coremod Java Agent旨在修补在许多不同mod中发现的严重安全漏洞.zip

    《Minecraft核心模组Java Agent:修复安全漏洞的利器》 在广受欢迎的沙盒游戏Minecraft中,玩家可以通过各种模组(Mods)扩展游戏功能,丰富游戏体验。然而,这些模组的开放性同时也为游戏带来了安全隐患。为了应对...

    Java Agent实现系统数据采集

    Java Agent是一种强大的技术,它允许我们在Java应用程序运行时对其进行拦截和增强,而无需修改源代码或重新部署。这种技术在系统监控、日志记录、性能分析、安全审计等多个领域都有广泛应用。本文将深入探讨如何使用...

    此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具

    此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具此项目是...

    java-agent学习1

    - 为了使 Java Agent 生效,需要在启动参数中指定 `-javaagent:E:\java安全\java内存马\agent-example\agent-demo\target\java-agent.jar` 2. **实现 `Test` 类** - `Test` 类中包含一个私有变量 `hello` 和一个 ...

Global site tag (gtag.js) - Google Analytics