java探针之修改类字节码文件

Java agent 探针技术(2)-JVM 启动后 agentmain 进行类运行时转换 文章目录1. 简介2. 使用 agentmain 的步骤3. 使用示例3.1 创建实现 ClassFileTransformer 接口的类3.2 创建使用 ClassFileTransformer 的 agentmain 类3.3 打包代理 jar 包3.4 打包目标程序 jar 包3.5 编写 attach 处理程序3.6 测试 1. 简介 premain 的代理 jar 包需要在 Java 程序启动时指定,并且只能在类加载之前修改字节码,类被加载之后就无能为力了。这种使用方式使其在应用场景上有很大的限 阅读详情

java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。像skywalking和arthas都使用到了这个技术。
具体原理为:

jdk1.5以后引入了javaAgent技术,javaAgent是运行方法之前的拦截器。我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时,同时将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中,然后根据map中相应参数或耗时方法轨迹中的关键代码区分出我们要抓取的耗时业务。最后将相应耗时轨迹文件取下来,转化为xml格式并进行解析,通过浏览器将代码分层结构展示出来,方便耗时分析。

上篇我们介绍了JavaAgent的基本使用,下面介绍如何去动态的修改类的字节码文件,这个才是agent实现更强大功能的核心所在!

Instrumentation接口

Instrumentation接口位于jdk1.6包java.lang.instrument包下,Instrumentation指的是可以独立于应用程序之外的代理程序,可以用来监控和扩展JVM上运行的应用程序,相当于是JVM层面的AOP。

功能:
监控和扩展JVM上的运行程序,它可以替换和修改java类的字节码以便采集数据,用于监控,性能统计,覆盖率分析,事件记录等。可以用在程序启动时,也可以用于程序运行时动态attach。

比如说一个Java程序在JVM上运行,这时如果需要监控JVM的状态,除了使用JDK自带的jps等命令之外,就可以通过instrument来更直观的获取JVM的运行情况;
或者一个Java方法在JVM中执行,如果我想获取这个方法的执行时间又不想改代码,常用的做法是通过Spring的AOP来实现,而AOP通过面向切面编程,而instrument是在JVM层面上直接改动java方法来实现。

public interface Instrumentation{
    //添加ClassFileTransformer
    void addTransformer(ClassFileTransformer transformer, boolean canRetransform);

    //添加ClassFileTransformer
    void addTransformer(ClassFileTransformer transformer);

    //移除ClassFileTransformer
    boolean removeTransformer(ClassFileTransformer transformer);

    //是否可以被重新定义
    boolean isRetransformClassesSupported();

    //重新定义Class文件
    void redefineClasses(ClassDefinition... definitions)
        throws ClassNotFoundException, UnmodifiableClassException;

    //是否可以修改Class文件
    boolean isModifiableClass(Class<?> theClass);

    //获取所有加载的Class
    @SuppressWarnings("rawtypes")
    Class[] getAllLoadedClasses();

    //获取指定类加载器已经初始化的类
    @SuppressWarnings("rawtypes")
    Class[] getInitiatedClasses(ClassLoader loader);

    //获取某个对象的大小
    long getObjectSize(Object objectToSize);

    //添加指定jar包到启动类加载器检索路径
    void appendToBootstrapClassLoaderSearch(JarFile jarfile);

    //添加指定jar包到系统类加载检索路径
    void appendToSystemClassLoaderSearch(JarFile jarfile);

    //本地方法是否支持前缀
    boolean isNativeMethodPrefixSupported();

    //设置本地方法前缀,一般用于按前缀做匹配操作
    void setNativeMethodPrefix(ClassFileTransformer transformer, String prefix);
}

要是定义了操作java类的class文件方法,这里又涉及到了ClassFileTransformer接口,这个接口的作用是改变Class文件的字节码,返回新的字节码数组,源码如下:

public interface ClassFileTransformer{

    byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException;
}

ClassFileTransformer接口只有一个方法,就是改变指定类的Class文件,该接口没有默认实现,很显然如果需要改变Class文件的内容,需要改成什么样需要使用者自己来实现。
如:

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;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyTransformer implements ClassFileTransformer {

    final static String prefix = "\nlong startTime = System.currentTimeMillis();\n";
    final static String postfix = "\nlong endTime = System.currentTimeMillis();\n";

    // 被处理的方法列表
    final static Map<String, List<String>> methodMap = new HashMap<>();

    public MyTransformer() {
        add("com.jun.sail.myservice.service.HelloService.say");
        add("com.jun.sail.myservice.service.HelloService.say2");
    }

    private void add(String methodString) {
        String className = methodString.substring(0, methodString.lastIndexOf("."));
        String methodName = methodString.substring(methodString.lastIndexOf(".") + 1);
        List<String> list = methodMap.computeIfAbsent(className, k -> new ArrayList<>());
        list.add(methodName);
    }

    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
                            ProtectionDomain protectionDomain, byte[] classfileBuffer) {
        className = className.replace("/", ".");
        if (methodMap.containsKey(className)) { // 判断加载的class的包路径是不是需要监控的类
            CtClass ctclass = null;
            try {
                // 使用全称,用于取得字节码类<使用javassist>
                ctclass = ClassPool.getDefault().get(className);
                for (String methodName : methodMap.get(className)) {
                    String outputStr = "\nSystem.out.println(\"this method [" + methodName
                            + "] cost:\" +(endTime - startTime) +\"ms.\");";
                    // 得到这方法实例
                    CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);

                    // 根据原来的方法 创建新的方法,名字为原来的methodName
                    CtMethod newMethod = CtNewMethod.copy(ctmethod, methodName, ctclass, null);

                    // 把旧方法名字改掉,否则会冲突
                    String oldMethodName = methodName + "$old";
                    ctmethod.setName(oldMethodName);

                    // 构建新的方法体
                    StringBuilder bodyStr = new StringBuilder();
                    bodyStr.append("{");
                    bodyStr.append(prefix);
                    bodyStr.append(oldMethodName).append("($$);\n");// 调用原有代码,类似于method();($$)表示所有的参数
                    bodyStr.append(postfix);
                    bodyStr.append(outputStr);
                    bodyStr.append("}");
                    newMethod.setBody(bodyStr.toString());

                    newMethod.setName(methodName);
                    ctclass.addMethod(newMethod);
                }
                return ctclass.toBytecode();
            } catch (Exception e) {
                System.out.println("AAAAA" + e.getMessage());
                e.printStackTrace();
            }
        }
        return null;
    }
}

然后在permain或agentmain方法中inst.addTransformer(new MyTransformer());,其他步骤同之前,不再赘述。

Instrumentation接口相当于一个代理,当执行premain方法时,通过Instrumentation提供的API可以动态的添加管理JVM加载的Class文件,Instrumentation管理着ClassFileTransformer。
ClassFileTransformer接口可以动态的改变Class文件的字节码,在加载字节码的时候可以将字节码进行动态修改,具体实现需要自定义实现类来实现ClassFileTransformer接口

Java字节码生成框架大致有ASM、Javassist和byte buddy三种

  • ASM框架介绍及使用
    ASM是一种Java字节码操控框架,能够以二进制形式修改已有的类或是生成类,ASM可以直接生成二进制class文件也可以在类被加载入JVM之前动态改变类,只不过ASM在创建class字节码时说底层JVM的汇编指令,需要使用者对class组织结构和JVM汇编指令有一定的了解。由于Java 类存储在.class文件中,这些类文件中包含有:类名称、方法、属性及字节码,ASM从类文件中读入信息后改变类行为、分析类信息或者直接创建新的类。

    著名的使用到ASM的案例便是lambda表达式、CGLIB动态代理类

    ASM框架核心类包含
    ClassReader:该类用来解析编译过的class字节码文件
    ClassWriter:该类用来重新构建编译后的类,比如修改类名、属性、方法或者根据要求创建新的字节码文件
    ClassAdapter:实现了ClassVisitor接口,将对它的方法调用委托给另一个ClassVisitor对象

  • Javassist及使用
    Javassit相比于ASM要简单点,Javassit提供了更高级的API,当时执行效率上比ASM要差,因为ASM上直接操作的字节码。功能和JDK自带的反射功能类似,但是比反射要强大。

    Javassist核心类包括ClassPool:
    一个基于HashMap实现的CtClass对象容器,key上类名,value上这个类的CtClass对象
    CtClass:表示一个类,可以从ClassPool中获取
    CtMethods:表示一个类的方法
    CtFields:表示类中的属性

  • Byte Buddy及使用
    byte buddy是一个提供了API用于生成任意Java类工具包,可以生成和修改字节码。

3. Instrumentation的实现原理

说起Instrumentation的原理,就不得不先提起JVMTI:
JVMTI官网文档
JVMTI
JVMTI 是JVM Tool Interface 的缩写,是 JVM 暴露出来给用户扩展使用的接口集合,JVMTI 是基于事件驱动的,JVM每执行一定的逻辑就会调用一些事件的回调接口,这些接口可以给用户自行扩展来实现自己的逻辑。JVMTI是实现 Debugger、Profiler、Monitor、Thread Analyser 和coverage analysis等工具的统一基础,在主流 Java 虚拟机中都有实现。

JVMTIAgent
JVMTI 是一套本地代码接口,因此使用 JVMTI 需要我们与 C/C++ 以及 JNI 打交道。事实上,开发时一般采用建立一个 Agent 的方式来使用 JVMTI,它使用 JVMTI 函数,设置一些回调函数,并从 Java 虚拟机中得到当前的运行态信息,并作出自己的判断,最后还可能操作虚拟机的运行态。把 Agent 编译成一个动态链接库之后,我们就可以在 Java 程序启动的时候来加载它(启动加载模式)
主要有三个函数:

  • Agent_OnLoad方法:如果agent是在启动时加载的,那么在JVM启动过程中会执行这个agent里的Agent_OnLoad函数
  • Agent_OnAttach方法:如果agent不是在启动时加载的,而是attach到目标程序上,然后通过load命令来加载agent,由ClassFileLoadHook event提供回调,调用Agent_OnAttach方法
  • Agent_OnUnload方法:在agent卸载时调用

回到主题,Instrument 就是一种 JVMTIAgent,它实现了Agent_OnLoad和Agent_OnAttach两个方法,也就是在使用时,Instrument既可以在启动时加载,也可以在运行时动态加载

  • 启动时加载就是在启动时添加JVM参数:-javaagent:XXXAgent.jar的方式
  • 运行时加载是通过JVM的attach机制来实现,通过发送load命令来加载,这种方式明显更加灵活,对监控目标启动也无限制,arthas的attach就是基于此
private void attachAgent(Configure configure) throws Exception {
        VirtualMachineDescriptor virtualMachineDescriptor = null;
        for (VirtualMachineDescriptor descriptor : VirtualMachine.list()) {
            String pid = descriptor.id();
            if (pid.equals(Integer.toString(configure.getJavaPid()))) {
                virtualMachineDescriptor = descriptor;
            }
        }
        VirtualMachine virtualMachine = null;
        try {
            if (null == virtualMachineDescriptor) { // 使用 attach(String pid) 这种方式
                virtualMachine = VirtualMachine.attach("" + configure.getJavaPid());
            } else {
                virtualMachine = VirtualMachine.attach(virtualMachineDescriptor);
            }

            Properties targetSystemProperties = virtualMachine.getSystemProperties();
            String targetJavaVersion = targetSystemProperties.getProperty("java.specification.version");
            String currentJavaVersion = System.getProperty("java.specification.version");
            if (targetJavaVersion != null && currentJavaVersion != null) {
                if (!targetJavaVersion.equals(currentJavaVersion)) {
                    AnsiLog.warn("Current VM java version: {} do not match target VM java version: {}, attach may fail.",
                                    currentJavaVersion, targetJavaVersion);
                    AnsiLog.warn("Target VM JAVA_HOME is {}, try to set the same JAVA_HOME.",
                                    targetSystemProperties.getProperty("java.home"));
                }
            }

            virtualMachine.loadAgent(configure.getArthasAgent(),
                            configure.getArthasCore() + ";" + configure.toString());
        } finally {
            if (null != virtualMachine) {
                virtualMachine.detach();
            }
        }
    }

通过 VirtualMachine , 可以attach到当前指定的jvm pid上,然后 virtualMachine.loadAgent()将编写好的agent用于监控目标。

总结:

  1. Instrumentation相当于一个JVM级别的AOP

  2. Instrumentation在JVM启动的时候监听事件,如类加载事件,JVM触发来指定的事件通过回调通知,并创建一个 Instrumentation接口的实例,然后找到MANIFEST.MF中配置的实现了premain方法的Class,然后将Instrumentation实例传入premain方法中

  3. premain方法会在main方法之前执行,可以添加ClassFileTransfer来实现对Class文件字节码的动态修改(并不会修改Class文件中的字节码,而是修改已经被JVM加载的字节码)

  4. 修改字节码的技术可以使用开源的 ASM、javassist、byteBuddy等

https://blog.youkuaiyun.com/u010862794/article/details/87773434

深入学习JVM探针与字节码技术 JVM探针是自jdk1.5以来,由虚拟机提供的一套监控类加载器和符合虚拟机规范的代理接口,结合字节码指令能够让开发者实现无侵入的监控功能。如:监控生产环境中的函数调用情况或动态增加日志输出等等。虽然在常规的业务中不会有太多用武之地,但是作为一项高级的技术手段也应该是资深开发人员的必备技能之一。同时,它也是企业级开发和生产环境部署不可或缺的技术方案,是对当下流行的APM的一种补充,因为使用探针技术能够实现比常规APM平台更细粒度的监控。 哪些方面适合使用探针技术: (1) 如果你发现生产环境上有些问题无法 阅读详情

相关推荐

【JAVA基础☞探针技术】Java探针-Java Agent技术

我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时,同时将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中,然后根据map中相应参数或耗时方法轨迹中的关键代码区分出我们要抓取的耗时业务。2、支持抓取特定的代码配置,方便对配置的特定方法进行抓取,过滤出关系的代码执行耗时情况。

BASK2311的博客 1927

Java探针之JavaAgent揭秘

java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。 javaAgent JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,在JVM启动的时候,会从agent包中找到MAINIFEST.MF中配置的Class,执行其实现的premain方法,而且这一步是在main方法之前执行的。这样就可以在JVM启动执行main方法之前做一些其他而外的操作了。 agen

学习 1572

JCOP:Java字节码热增强的轻量级命令行工具

Java字节码增强是实现JVM运行时行为干预、热修复与可观测性探针植入的核心技术。其原理基于Instrumentation API的retransformClasses机制,通过动态重写类字节码达成无需重启的运行时修改。技术价值在于突破源码依赖与编译期限制,支撑灰度修复、中间件埋点、教学演示等高敏场景。相比Byte Buddy等底层框架,JCOP以Java语法DSL封装字节码操作,显著降低学习门槛;相较Spring AOP或Arthas,它支持static/private方法及行号级注入,填补了‘可写’与‘

weixin_28831399的博客 181

字节码增强技术ByteBuddy和探针技术-JavaAgent

如何动态修改运行中的字节码,有两个步骤,1:生成新的字节码2:替换旧的字节码 谁去修改字节码,就是字节码增强框架做的事。 修改后的字节码数据是怎么生效的,主要由Java Agent技术来实现。Asm,Javassist,ByteBuddy

qq_30246135的博客 2185

四旋翼滑模控制:从理论到Simulink实现

本文深入探讨了四旋翼滑模控制的理论与Simulink实现,对比了其相较于PID控制在抗干扰和鲁棒性方面的显著优势。文章详细介绍了从精确动力学建模、内外环滑模控制器设计到指令解算的完整流程,并分享了Simulink仿真搭建、参数调试及抗扰性能验证的实战经验,帮助工程师掌握在复杂环境下提升四旋翼稳定性的进阶技能。

weixin_29163581的博客 375

CTF实战:Wireshark数据包分析从入门到精通(附经典题型解析)

本文详细介绍了Wireshark在CTF比赛中的数据包分析技巧,从基础抓包到高级协议解析,涵盖HTTP流量分析、USB键盘数据还原等实战案例。通过经典题型解析,帮助读者掌握精准过滤、文件提取等核心技能,提升CTF竞赛中的网络流量分析能力。

pz890123的博客 585

Java Agent 探针技术

Java Agent 直译为 Java 代理,也常常被称为 Java 探针技术。Java Agent 是在 JDK1.5 引入的,是一种可以动态修改 Java 字节码的技术。Java 中的类编译后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码的信息,并且通过字节码转换器对这些字节码进行修改,以此来完成一些额外的功能。Java Agent 是一个不能独立运行 jar 包,它通过依附于目标程序的 JVM 进程,进行工作。

BASK2312的博客 3017

i春秋第二届春秋欢乐赛 classical writeup

i春秋第二届春秋欢乐赛 classical writeup 第一步:题目给出的提示 根据题目我们可以了解这道题应该是一个古典密码的题目,但是古典密码太多了我们如何知道是什么? 看题目给出的附件是一个很长很长的乱序字符串,我们可以想到用词频分析一下: 发现里面有一段不一样的信息:LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9 像是base64解码能够做出来,但是发现...

hanjinrui15的博客 1429

java--字节码增强--2.1--Agent--介绍

java–字节码增强–2.1–Agent–介绍 1、介绍 笼统地来讲,Java Agent 是一个统称,该功能是 Java虚拟机 提供的一整套后门,通过这套后门可以对虚拟机方方面面进行监控与分析,甚至干预虚拟机的运行。 Java Agent 又叫做 Java探针,是一种可以动态修改 Java字节码的技术。 Java类 编译之后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码信息,并且通过字节码转换器对这些字节码进行修改,来完成一些额外的功能。 2、Instrumenta

zhou920786312的博客 550

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1258

【异常】Coze/扣子 Workflow 调用报 4200 错误深度解析

Coze API 的。

奶爸的编程之路,也就一周冷个三天 299

JAVA探针机制—Agent(一)

JAVA探针机制—Agent(一) agent机制首次出现在JDK5版本,在JDK6版本得到升级并且正式被官方定义为agent原理。 首先要明确JavaAgent是一个JVM层面的插件,他可以利用JDK中的Instrumenttation类,实现对类字节码文件的修改。 而Agent在功能上的实现有两种情况: 在main方法执行前,调用premain方法。 在main方法执行后,监控JVM虚拟机的同时,调用agentmain方法。 目前市场上很多日志、热部署、性能监控等等插件功能,都是基于探针中agent

weixin_42454225的博客 4423

人工智能训练师三级考试备考全攻略|报名条件+真题+补贴申领一站式通关(2026版)

本专栏是人工智能训练师三级考证最完整的备考指南,共77篇文章,覆盖从职业认知、报名实操、AI基础知识、数据标注、模型训练测试部署、考前冲刺到考后进阶的全链路。本导读按模块整理了全部文章链接,帮你快速定位所需内容。人工智能训练师是国家认定的正式职业,证书可在osta.mohrss.gov.cn查询,三级证书可申领最高3120元技能补贴。

白话机器学习 1779

trace java_使用java动态字节码技术简单实现arthas的trace功能。

参考资料用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具。不管是线上还是线下,我们都可以用Arthas分析程序的线程状态、查看jvm的实时运行状态、打印方法的出入参和返回类型、收集方法中每个代码块耗时,甚至可以监控类、方法的调用次数、成功次数、失败次数、平均响应时长、失败率等。前几天学习java动态字节码技术时,突然想起这款java诊断工具的trace...

weixin_35723924的博客 356

Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度

【代码】Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度。

weixin_41346436的博客 1797

Nexys4DDR+OV7670实现图像灰度显示系统嵌入式

通过对硬件平台的准备、Vivado工程配置、OV7670驱动程序的编写、图像灰度处理算法的设计以及系统集成与测试,我们成功实现了一个基于嵌入式系统的图像处理应用。当系统运行时,OV7670摄像头模块将采集到的图像传输到FPGA芯片中,然后通过图像灰度处理算法将彩色图像转换为黑白图像,并在显示设备上进行显示。OV7670摄像头模块的驱动程序是实现图像采集的核心。以上代码中,我们使用了Xilinx提供的XGpio和Xil_In32函数来进行OV7670摄像头数据的读取和GPIO的初始化。OV7670驱动程序。

WangWEel的博客 337

Java探针

使用java代理来实现java字节码注入 使用JavaSsist可以对字节码进行修改 使用ASM可以修改字节码 使用Java代理和ASM字节码技术开发java探针工具可以修改字节码 备注:javassist是一个库,实现ClassFileTransformer接口中的transform()方法。ClassFileTransformer 这个接口的目的就是在class被装载到JVM...

weixin_30906185的博客 2214

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java Agent【java探针】及AspectJ

Java Agent 又叫做Java 探针,从JDK1.5 开始引入,可在类加载前修改class字节码。Jvm启动参数-javaagent参数 俗称java探针技术(Premain方式)使用方法:-javaagent:xxx.jar, 在main方法执行前查找jar中MANIFEST.MF文件的配置项,Premain-Class对应一个java类,然后执行方法和,如果同时存在,执行前者。AspectJ是一个面向切面的框架(AOP框架)。

Deep Water Slow 2098

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java探针--javaagent--使用/实例

本文用示例介绍javaagent的用法。

IT利刃出鞘的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java Agent (java 探针)

Java agent,笼统地来讲java agent是一个统称,该功能是java虚拟机提供的一整套后门,通过这套后门可以对虚拟机方方面面进行监控与分析,甚至是干预。Java agent又叫java 探针,实在JDK1.5引入的一种可以动态修改java字节码的技术。Java类编译之后形成的字节码被JVM执行,在JVM执行这些字节码之前获取这些字节码信息,并且通过字节码转换器对这些字节码进行修改,来完成一些额外的功能。JDK5.0开始,提供了一个名为java.lang.instrument的工具包。

qq_20525137的博客 3272

Java探针-Java Agent技术

https://www.cnblogs.com/aspirant/p/8796974.html 最近面试阿里,面试官先是问我类加载的流程,然后问了个问题,能否在加载类的时候,对字节码进行修改 我懵逼了,答曰不知道,面试官说可以的,使用Java探针技术,能够实现 我查了一下关于探针技术的知识: 2. 基于javaAgent和Java字节码注入技术的java探针工具技术原理 图0...

z69183787的专栏 1859

Java agent 探针技术(1)-JVM 启动时 premain 进行类加载期增强

文章目录1. 简介2. 使用 Java agent 的步骤3. 使用示例 1. 简介 在之前的文章 静态代理 一节中我们已经提到过 Java 探针技术,简单来说,在 JDK 1.5中 Java 引入了 java.lang.Instrument 包,该包提供了一些工具使得在类加载时期修改 Class 类成为了可能。这实际上就是提供了一种虚拟机级别的 AOP,其基本的原理可依据下图阐明: 在 类加载过程 一文我们提到了类加载的过程,其第一步就是加载。其实从 Java 类完整的生命周期来看,从 Java 源文件

谈谈1974 5684

ASM修改字节码

ASM的TreeApi 对于Method的转换、生成也提供了一系列的组件和接口。 可以用它来动态修改一些字节码,达到aop的思想。也可用来做java的探针机制。 以下使用它来动态修改了方法。达到注入了一些逻辑。 package test.asm.inteceptor; import org.objectweb.asm.ClassReader; import org.objectweb.asm....

qqBo1230的博客 1062

「JAVA基础探针技术」Java探针-Java Agent技术

我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时,同时将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中,然后根据map中相应参数或耗时方法轨迹中的关键代码区分出我们要抓取的耗时业务。2、支持抓取特定的代码配置,方便对配置的特定方法进行抓取,过滤出关系的代码执行耗时情况。

z1ztai的博客 813

java agent 字节码增强demo实现,无修改增强服务

通过Java Agent机制在应用启动时加载使用字节码增强技术修改类的字节码在方法执行前后插入监控代码收集并输出监控数据SkyWalking等APM工具的核心原理与此类似,但实现了更复杂的功能和更完善的生态系统。理解这个基本原理有助于更好地使用和调试分布式追踪系统。// 待补充真实增强案例。

weixin_45762066的博客 1092
上一篇: Java探针之JavaAgent揭秘
下一篇: 重要的基础注解@import
余生之君
博客等级 码龄10年 246粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值