`
strongant
  • 浏览: 66625 次
  • 性别: Icon_minigender_1
  • 来自: IT
社区版块
存档分类
最新评论

javaagent+javassist实现故障注入遇到问题

阅读更多

 

ClassPool pool = ClassPool.getDefault(); 

CtClass ctclass = pool.get(className);

 

上面二行代码,在web容器下是拿不到Class对象,官方已经解释了,如下:

The default ClassPool returned by a static method ClassPool.getDefault() searches the same path that the underlying JVM (Java virtual machine) has. If a program is running on a web application server such as JBoss and Tomcat, the ClassPool object may not be able to find user classes since such a web application server uses multiple class loaders as well as the system class loader. In that case, an additional class path must be registered to the ClassPool. Suppose that pool refers to a ClassPool object:  

 

修改成如下代码:

                                ClassPool pool = ClassPool.getDefault(); 

                                pool.insertClassPath(new ClassClassPath(this.getClass()));

 

                                CtClass ctclass = pool.get(className);

 

然后,把自己开发的agent文件,如:myagnet.jar,把该jar放入目标系统位置/WEB-INF/lib/下面一起发布到web容器。

myagent.jar的MANIFEST.MF配置文件:

Manifest-Version: 1.0

Premain-Class: XXXXXXXXXXXXXXX.client.XXXXAgent

Can-Redefine-Classes: true

Class-Path: dubbo-2.5.3.jar javassist-3.19.0-GA.jar

//这个文件最后一行必须是空

 

myagent.jar依赖这二个dubbo-2.5.3.jar javassist-3.19.0-GA.jar,这二个文件必须确保在/WEB-INF/lib下面存在

 

如果被注入的目标系统非web环境,那么这三个文件jar(myagent.jar、dubbo-2.5.3.jar、javassist-3.19.0-GA.jar)同一个位置即可。

 

在目标系统配置VM启动参数,增加如下一行:

-javaagent:D:\XXX\tomcat-7.0.52\webapps\项目名\WEB-INF\lib\myagent.jar

 

分享到:
评论

相关推荐

    javaagent+javassist

    例如,我们可以通过javaagent在程序启动时注入javassist生成的代码,以实现对目标类的动态增强。以下是一个简单的示例: 1. 创建一个`javaagent`,定义一个`premain`方法,该方法会在JVM启动时被调用: ```java ...

    agent+javassist例子

    `Java Agent`允许我们对Java应用程序进行预处理,比如字节码注入,而`javassist`库则提供了一个方便的方式来动态地操作和修改Java类的字节码。 `Java Agent`是Java平台提供的一种机制,允许开发者在程序运行前或...

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

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

    javassist+javaAgent探针, 实现jvm退出时打印线程栈日志

    javassist+javaAgent探针, 实现jvm退出时打印线程栈日志,方便排查是哪个线程调用了退出,以及退出码

    JavaAgent例子-agentmain方式

    JavaAgent是一种强大的技术,它允许我们在Java应用程序启动后或运行时动态地注入代码,从而实现对程序行为的监控、性能分析、安全控制等目的。在Java中,有两种启动JavaAgent的方式:premain和agentmain。本示例主要...

    collection-agent:通过javaagent和javassist技术实现对java的ArrayList和HashMap的增强,避免在虚拟器一次load大量数据时导致OOM

    通过javaagent和javassist技术实现对java的ArrayList和HashMap的增强,在操作集合元素时判断集合元素个数, 当集合元素个数大于设置的上限时,抛出异常,终止此次操作,从而避免在集合元素过大导致OOM. #使用方式: ...

    java项目实现热更源码-javaagent

    为了成功实现这个项目,你需要理解Java字节码操作(如ASM、ByteBuddy或Javassist库),并熟悉Java Agent的相关API。同时,了解JVM内存模型和类加载机制也是必不可少的。通过学习这些知识,你将能够创建一个高效且...

    java agent 使用及实现代码

    Java Agent 使用及实现代码 Java Agent 是一种可以在字节码层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要讲解 Java Agent 的使用及实现代码。 什么是 Java Agent Java Agent 是...

    javaagent:基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志

    javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控。相比于NewRelic或者开源的,以及阿里的,本工具主打的是简单,我们只记录每个方法的执行...

    Javassist代码注入

    在本文中,我们将深入探讨Javassist如何实现代码注入,并结合实例`HotPatchDemo`来展示其实现过程。 首先,理解代码注入的基本概念是必要的。代码注入是一种技术,允许在程序运行时向现有代码中插入新的行为或修改...

    javaagent-samples:Java乐器样本

    JavaAgent 示例说明 ①、 javassist.iedis.crack.IedisCrack1和javassist.iedis.crack.IedisCrack2为使用...javaagent.sample.transformer.InjectPrintTransformer 演示了使用javaagent结合javassist匹配返回值为St

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

    JavaAgent是Java平台提供的一种机制,可以用来在类加载时或虚拟机启动时注入自定义的行为。这通常涉及到字节码增强,即在程序运行之前或运行时修改类的字节码,以添加新的功能或改变现有行为。这种技术在性能监控、...

    第二课:调用链核心技术-Agent采集埋点实现1

    Java Agent 和 Javaassist 是在 Java 应用程序中实现非侵入式监控和埋点的关键技术。Java Agent 提供了一种在类加载到 JVM 之前进行拦截和修改的能力,而 Javaassist 是一个开源库,允许我们动态地修改字节码,使得...

    Java Agent实现系统数据采集

    本文将深入探讨如何使用Java Agent来实现系统数据采集。 首先,我们需要了解Java代理(Agent)的工作原理。在Java中,Agent是通过Java instrumentation API实现的,这个API提供了对已加载类进行操作的能力。`java....

    java agent demo

    在Java Agent的实现中,`javassist`可以帮助我们在运行时检查和修改类的字节码,比如添加方法、修改方法体、插入监控代码等。通过`javassist.CtClass`和`javassist.CtMethod`等类,我们可以方便地操作Java类和方法。...

    S-MVP::fire::fire:优化版MVP,使用注解泛型简化代码编写,使用串行协议方便维护,APT过程使用注解解析器利用JavaPoet:full_moon_face:完成重复模块的编写,利用ASpect + GradlePlugin完成横向AOP编程+ Javassist动态字节码注入+ Tinker实现热修复+ Retrofit实现优雅网络操作+ RxJava轻松玩转数据处理

    所以,在MVC模型里,Model不依赖于View,但是如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。 MVP时代:在MVP里,Presenter完全把模型和视图进行了分离,...

    java 反编译工具 jboss-javassist

    Java反编译工具JBoss Javassist是一款强大的Java...遇到问题时,可以查阅Javassist的官方文档,或者在相关的论坛和社区寻求帮助。Javassist是一个强大而灵活的工具,熟练掌握它将极大地提升开发效率和解决问题的能力。

    javassist+jd-gui

    结合使用 `javassist` 和 `jd-gui`,开发者可以实现诸如动态代理、日志插桩、性能监控等功能,同时在遇到无法获取源码的库时,`jd-gui` 可以帮助解析其内部逻辑。这种组合为Java开发者提供了一套强大的工具集,能够...

    java-agent学习1

    通过以上步骤,我们不仅了解了 Java Agent 的基本概念和应用场景,还深入学习了如何实现一个简单的 Java Agent。Java Agent 的强大之处在于它能够在不修改源代码的情况下对现有应用程序进行增强,这在生产环境中对于...

    Javassistjar包

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

Global site tag (gtag.js) - Google Analytics