大模型应用监控不内卷!Java Agent带你躺平实现无侵入监控
应用场景APM应用性能监控。如 SkyWalking、OpenTelemetry 等通过 Agent 插桩收集调用链、耗时等代码覆盖率工具如 JaCoCo 在测试时注入探针统计覆盖情况热部署 / 热更新如 JRebel 利用 Agent 修改类定义实现无需重启生效安全审计 / 日志增强自动为敏感方法添加日志或权限检查故障注入 / 混沌工程动态修改行为模拟异常静态加载示例时机在目标程序的 main() 入口方法之前执行加载方式通过添加 JVM 参数【-javaagent:Agent-Jar包全路径参数】 来加载参数的格式一般使用【key1value1,keyNvalueN】类加载状态所有应用类都尚未加载Agent 有完全的控制权能力可以执行任意字节码转换包括添加字段、方法等重启要求需要重启 JVM代码与运行示例Agent模块依赖坐标dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy/artifactId version1.17.8/version /dependency dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy-agent/artifactId version1.17.8/version /dependencyAgent模块pom.xml 插件配置build plugins !-- Java Agent插件 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.6.1/version executions execution !-- 插件在打包时才执行 -- phasepackage/phase !-- 插件执行时执行maven-shade-plugin的shade操作 -- goals goalshade/goal /goals configuration !-- 不生成精简pom文件保持完整的依赖树 -- createDependencyReducedPomfalse/createDependencyReducedPom transformers !-- 生成jar包时添加Agent需要的MANIFEST.MF条目 -- transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer !-- 入口配置 -- manifestEntries !-- 静态加载Agent的入口类 -- Premain-Classwxw.mengyuan.DemoAgent/Premain-Class !-- 动态加载Agent的入口类 -- Agent-Classwxw.mengyuan.DemoAgent/Agent-Class !-- 允许重转换已加载类 -- Can-Retransform-Classestrue/Can-Retransform-Classes !-- 允许重新定义类结构 -- Can-Redefine-Classestrue/Can-Redefine-Classes !-- 设置native方法前缀 -- Can-Set-Native-Method-Prefixfalse/Can-Set-Native-Method-Prefix /manifestEntries /transformer !-- 合并所有依赖中 META-INF/services 目录下的文件 -- transformer implementationorg.apache.maven.plugins.shade.resource.ServicesResourceTransformer/ /transformers !-- 排除数字签名文件 -- filters filter artifact*:*/artifact excludes excludeMETA-INF/*.SF/exclude excludeMETA-INF/*.DSA/exclude excludeMETA-INF/*.RSA/exclude /excludes /filter /filters !-- 重命名依赖避免冲突 -- relocations relocation patterncom.google/pattern shadedPatterncom.yourcompany.shaded.google/shadedPattern /relocation relocation patternorg.apache/pattern shadedPatterncom.yourcompany.shaded.apache/shadedPattern /relocation /relocations /configuration /execution /executions /plugin /plugins /buildAgent模块方法拦截处理器package wxw.mengyuan; import net.bytebuddy.implementation.bind.annotation.*; import java.lang.reflect.Method; import java.util.concurrent.Callable; public class AgentInterceptor { RuntimeType public static Object intercept(Origin Method method, SuperCall Callable? callable) throws Throwable { long start System.currentTimeMillis(); try { return callable.call(); } finally { System.out.println(方法【 method.getDeclaringClass().getName() . method.getName() 】执行耗时 (System.currentTimeMillis() - start) ms); } } }Agent模块入口类package wxw.mengyuan; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.utility.JavaModule; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; public class DemoAgent { /** * JVM启动时加载 * param agentArgs 参数 * param inst 该对象可以操作一些类里面的方法 */ public static void premain(String agentArgs, Instrumentation inst) { System.out.println(静态加载当前方法执行在main入口方法之前); System.out.println(参数 agentArgs); // 创建转换器 AgentBuilder.Transformer transformer new AgentBuilder.Transformer() { Override public DynamicType.Builder? transform(DynamicType.Builder? builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, ProtectionDomain protectionDomain) { return builder // 拦截哪些方法 // 仅此仅拦截 public 修饰符的方法 .method(ElementMatchers.isPublic()) // 声明拦截器 // 使用哪个类处理拦截逻辑 .intercept(MethodDelegation.to(AgentInterceptor.class)); } }; // 开始构建 new AgentBuilder.Default() // 拦截哪些类 // 此处仅拦截自身项目下、带有注解 Controller、RestController 的类 .type(ElementMatchers.nameStartsWith(wxw.mengyuan).and( ElementMatchers.isAnnotatedWith(ElementMatchers.named(org.springframework.web.bind.annotation.RestController)) .or(ElementMatchers.isAnnotatedWith(ElementMatchers.named(org.springframework.stereotype.Controller))) )) // 设置转换器 .transform(transformer) // 开始安装 .installOn(inst); System.out.println(静态加载加载完成); } /** * JVM运行时动态加载 * param agentArgs 参数 * param inst 该对象可以操作一些类里面的方法 */ public static void agentmain(String agentArgs, Instrumentation inst) { System.out.println(JVM运行时动态加载); } }Spring MVC应用Controller类package wxw.mengyuan.banner; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; RestController RequestMapping(/demo) public class DemoController { /** * 此方法会被拦截增强 */ PostConstruct public void init() { System.out.println(Controller初始化完毕); } /** * 此方法会被拦截增强 */ RequestMapping(demoTest) public String demoTest() { print(); return 娃哈哈~; } /** * 私有方法此方法不会被拦截增强 */ private void print() { System.out.println(进入了Controller方法); } }Spring MVC应用JVM参数-javaagent:D:\Projects\DEMO\Demo-Agent\target\demo-agent-1.0.0.jarkey1value1Spring MVC应用启动日志Spring MVC应用接口调用日志动态加载示例时机在目标程序运行时动态附加加载方式通过 Attach API 加载类加载状态大部分应用类已加载转换受限能力只能进行受限的字节码转换重启要求不需要重启 JVM代码与运行示例Agent模块依赖坐标dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy/artifactId version1.17.8/version /dependency dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy-agent/artifactId version1.17.8/version /dependencyAgent模块pom.xml 插件配置build plugins !-- Java Agent插件 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.6.1/version executions execution !-- 插件在打包时才执行 -- phasepackage/phase !-- 插件执行时执行maven-shade-plugin的shade操作 -- goals goalshade/goal /goals configuration !-- 不生成精简pom文件保持完整的依赖树 -- createDependencyReducedPomfalse/createDependencyReducedPom transformers !-- 生成jar包时添加Agent需要的MANIFEST.MF条目 -- transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer !-- 入口配置 -- manifestEntries !-- 静态加载Agent的入口类 -- Premain-Classwxw.mengyuan.DemoAgent/Premain-Class !-- 动态加载Agent的入口类 -- Agent-Classwxw.mengyuan.DemoAgent/Agent-Class !-- 允许重转换已加载类 -- Can-Retransform-Classestrue/Can-Retransform-Classes !-- 允许重新定义类结构 -- Can-Redefine-Classestrue/Can-Redefine-Classes !-- 设置native方法前缀 -- Can-Set-Native-Method-Prefixfalse/Can-Set-Native-Method-Prefix /manifestEntries /transformer !-- 合并所有依赖中 META-INF/services 目录下的文件 -- transformer implementationorg.apache.maven.plugins.shade.resource.ServicesResourceTransformer/ /transformers !-- 排除数字签名文件 -- filters filter artifact*:*/artifact excludes excludeMETA-INF/*.SF/exclude excludeMETA-INF/*.DSA/exclude excludeMETA-INF/*.RSA/exclude /excludes /filter /filters !-- 重命名依赖避免冲突 -- relocations relocation patterncom.google/pattern shadedPatterncom.yourcompany.shaded.google/shadedPattern /relocation relocation patternorg.apache/pattern shadedPatterncom.yourcompany.shaded.apache/shadedPattern /relocation /relocations /configuration /execution /executions /plugin /plugins /buildAgent模块构造方法拦截处理器package wxw.mengyuan; import net.bytebuddy.asm.Advice; import java.lang.reflect.Constructor; public class ConstructorAdvice { /** * 进入构造方法时调用 * param constructor 构造方法 * return 传给 Advice.OnMethodExit 标注方法中的数据 */ Advice.OnMethodEnter static long enter(Advice.Origin Constructor? constructor) { System.out.println(进入构造方法: constructor.getDeclaringClass().getName()); return System.currentTimeMillis(); } /** * 退出构造方法时调用 * param constructor 构造方法 * param start Advice.OnMethodEnter 标注方法的返回值 */ Advice.OnMethodExit static void exit(Advice.Origin Constructor? constructor, Advice.Enter long start) { System.out.println(构造方法【 constructor.getDeclaringClass().getName() 】执行耗时 (System.currentTimeMillis() - start) ms); } }Agent模块非构造方法拦截处理器package wxw.mengyuan; import net.bytebuddy.asm.Advice; import net.bytebuddy.implementation.bytecode.assign.Assigner; import java.lang.reflect.Method; public class NotConstructorAdvice { /** * 进入方法时调用 * param method 方法 * return 传给 Advice.OnMethodExit 标注方法中的数据 */ Advice.OnMethodEnter static long enter(Advice.Origin Method method) { System.out.println(进入方法: method.getDeclaringClass().getName() . method.getName()); return System.currentTimeMillis(); } /** * 退出方法时调用 * param method 方法 * param start Advice.OnMethodEnter 标注方法的返回值 * param returnValue 方法返回结果 * param throwable 异常 */ Advice.OnMethodExit(onThrowable Throwable.class) static void exit(Advice.Origin Method method, Advice.Enter long start, Advice.Return(readOnly false, typing Assigner.Typing.DYNAMIC) Object returnValue, Advice.Thrown Throwable throwable) { String methodInfo method.getDeclaringClass().getName() . method.getName(); if (throwable ! null) { System.err.println(方法【 methodInfo 】执行耗时 (System.currentTimeMillis() - start) ms异常 throwable.getMessage()); } else { System.out.println(方法【 methodInfo 】执行耗时 (System.currentTimeMillis() - start) ms); } } }Agent模块入口类package wxw.mengyuan; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.utility.JavaModule; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; public class DemoAgent { /** * JVM启动时加载 * param agentArgs 参数 * param inst 该对象可以操作一些类里面的方法 */ public static void premain(String agentArgs, Instrumentation inst) { System.out.println(静态加载当前方法执行在main入口方法之前); } /** * JVM运行时动态加载 * param agentArgs 参数 * param inst 该对象可以操作一些类里面的方法 */ public static void agentmain(String agentArgs, Instrumentation inst) { System.out.println(动态加载JVM运行过程中加载); System.out.println(参数 agentArgs); // 创建转换器 AgentBuilder.Transformer transformer new AgentBuilder.Transformer() { Override public DynamicType.Builder? transform(DynamicType.Builder? builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, ProtectionDomain protectionDomain) { return builder // 对构造方法的拦截处理 .visit(Advice.to(ConstructorAdvice.class).on(ElementMatchers.isConstructor())) // 对非构造方法的拦截处理 // 仅此仅拦截 public 修饰符的方法 .visit(Advice.to(NotConstructorAdvice.class).on(ElementMatchers.isPublic().and(ElementMatchers.not(ElementMatchers.isConstructor())))); } }; // 开始构建 new AgentBuilder.Default() .disableClassFormatChanges() .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) // 打印调试日志 .with(AgentBuilder.Listener.StreamWriting.toSystemOut().withErrorsOnly()) // 拦截哪些类 // 此处仅拦截自身项目下、带有注解 Controller、RestController 的类 .type(ElementMatchers.nameStartsWith(wxw.mengyuan).and( ElementMatchers.isAnnotatedWith(ElementMatchers.named(org.springframework.web.bind.annotation.RestController)) .or(ElementMatchers.isAnnotatedWith(ElementMatchers.named(org.springframework.stereotype.Controller))) )) // 设置转换器 .transform(transformer) // 开始安装 .installOn(inst); System.out.println(动态加载加载完成); } }Spring MVC应用Controller类package wxw.mengyuan.banner; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; RestController RequestMapping(/demo) public class DemoController { /** * 此方法会被拦截增强 */ PostConstruct public void init() { System.out.println(Controller初始化完毕); } /** * 此方法会被拦截增强 */ RequestMapping(demoTest) public String demoTest() { print(); return 娃哈哈~; } /** * 私有方法此方法不会被拦截增强 */ private void print() { System.out.println(进入了Controller方法); } }Spring MVC应用启动日志测试工程依赖坐标dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy/artifactId version1.17.8/version /dependency dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy-agent/artifactId version1.17.8/version /dependency dependency groupIdnet.java.dev.jna/groupId artifactIdjna/artifactId version5.18.1/version scopecompile/scope /dependency dependency groupIdnet.java.dev.jna/groupId artifactIdjna-platform/artifactId version5.18.1/version scopecompile/scope /dependency测试工程测试类编写后运行package com.mengyuan; import net.bytebuddy.agent.VirtualMachine; import java.io.IOException; public class DemoMain { public static void main(String[] args) { try { // 参数为目标JVM的PID VirtualMachine vm VirtualMachine.ForHotSpot.attach(56900); vm.loadAgent(D:\\Projects\\DEMO\\Demo-Agent\\target\\demo-agent-1.0.0.jarkey1value1); System.out.println(运行时动态加载成功); } catch (IOException e) { throw new RuntimeException(e); } } }Spring MVC应用动态加载日志Spring MVC应用接口调用日志学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关新闻

“改Prompt靠猜,上线靠反馈“终结者!AI Agent评估全攻略,让迭代效率翻倍

“改Prompt靠猜,上线靠反馈“终结者!AI Agent评估全攻略,让迭代效率翻倍

做 Agent 开发的同学大概率都有过这样的经历:优化了一轮提示词,本地测试几个场景都顺风顺水,结果上线后用户吐槽 “不如之前好用”。 想验证是真的性能退化还是个别案例的噪声,却只能靠手动复现,既耗时又无法覆盖全场…

2026/7/3 18:32:30 阅读更多 →
百万量产之后,轻舟智航又盯上了L4无人车 | 对话于骞

百万量产之后,轻舟智航又盯上了L4无人车 | 对话于骞

文|刘俊宏 编|王一粟 2025年,是智驾的关键转折之年。 这一年,端到端大模型成为共识,城市NOA开始向10万级车型下放,高阶智驾不再是豪华车的专属,而是逐渐走向全民标配。 在这一年里&#xff…

2026/7/3 18:32:32 阅读更多 →
前端开发总结的一些技巧和实用方法

前端开发总结的一些技巧和实用方法

本文主要介绍一些JS中用到的小技巧和实用方法,可以在日常Coding中提升幸福度,也可以通过一些小细节来增加代码可读性,让代码看起来更加优雅,后续将不断更新 1.数组 map 的方法 (不使用Array.Map) Array.from 还可以接受第二个参数…

2026/7/4 13:57:57 阅读更多 →

最新新闻

DC-DC降压转换器设计与PID控制优化实践

DC-DC降压转换器设计与PID控制优化实践

1. 项目背景与核心器件选型解析在电力电子领域,DC-DC降压转换器(Buck Converter)是最基础也最关键的拓扑结构之一。这次我们要实现的方案采用了171010550电源管理IC与PIC18F97J60微控制器的组合,这个搭配在工业控制领域颇具代表性…

2026/7/5 23:25:05 阅读更多 →
AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 面对繁重的在线学习任务,你是否还在为U校园平台的网课作业而烦恼…

2026/7/5 23:23:04 阅读更多 →
XXE漏洞深度解析:从XML外部实体注入原理到实战防御

XXE漏洞深度解析:从XML外部实体注入原理到实战防御

1. 项目概述:为什么XXE漏洞至今仍是“隐形杀手”?在Web安全领域,SQL注入、XSS这些名词大家耳熟能详,但提到XXE(XML External Entity Injection,XML外部实体注入),很多开发者甚至安全…

2026/7/5 23:19:03 阅读更多 →
开源小模型如何重构AI商业逻辑:7B参数的确定性价值

开源小模型如何重构AI商业逻辑:7B参数的确定性价值

1. 一家没做消费级产品的AI公司,凭什么拿到6.4亿美元? 你可能刚刷到这条新闻:“估值64亿美元!Mistral AI官宣6.4亿美元B轮融资”——第一反应是:又一家大模型创业公司爆了?但稍一查就会发现,它既…

2026/7/5 23:17:02 阅读更多 →
CATANet:基于内容感知Token聚合的图像超分辨率技术解析

CATANet:基于内容感知Token聚合的图像超分辨率技术解析

1. 从传统超分辨率到CATANet的技术演进图像超分辨率(Super-Resolution, SR)技术在过去十年经历了三次重大技术迭代。最早期的SRCNN开创了深度学习在超分辨率领域的应用,采用简单的三层卷积网络结构。2017年EDSR和RCAN引入残差学习和通道注意力…

2026/7/5 23:17:02 阅读更多 →
Linux命令-reject(拒绝打印任务)

Linux命令-reject(拒绝打印任务)

Linux命令-reject(拒绝打印任务)命令语法常用选项场景化实例1. 拒绝指定打印机2. 带原因说明拒绝3. 批量拒绝多个打印机4. 打印机故障自动处理5. 恢复打印机接受任务6. 通过 CUPS Web 接口管理7. 配合系统监控脚本查询打印队列状态最佳实践快速参考&…

2026/7/5 23:15:02 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻