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生成的代码,以实现对目标类的动态增强。以下是一个简单的示例: 1. 创建一个`javaagent`,定义一个`premain`方法,该方法会在JVM启动时被调用: ```java ...
`Java Agent`允许我们对Java应用程序进行预处理,比如字节码注入,而`javassist`库则提供了一个方便的方式来动态地操作和修改Java类的字节码。 `Java Agent`是Java平台提供的一种机制,允许开发者在程序运行前或...
在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM这两个库来实现JavaAgent。 首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行...
javassist+javaAgent探针, 实现jvm退出时打印线程栈日志,方便排查是哪个线程调用了退出,以及退出码
JavaAgent是一种强大的技术,它允许我们在Java应用程序启动后或运行时动态地注入代码,从而实现对程序行为的监控、性能分析、安全控制等目的。在Java中,有两种启动JavaAgent的方式:premain和agentmain。本示例主要...
通过javaagent和javassist技术实现对java的ArrayList和HashMap的增强,在操作集合元素时判断集合元素个数, 当集合元素个数大于设置的上限时,抛出异常,终止此次操作,从而避免在集合元素过大导致OOM. #使用方式: ...
为了成功实现这个项目,你需要理解Java字节码操作(如ASM、ByteBuddy或Javassist库),并熟悉Java Agent的相关API。同时,了解JVM内存模型和类加载机制也是必不可少的。通过学习这些知识,你将能够创建一个高效且...
Java Agent 使用及实现代码 Java Agent 是一种可以在字节码层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要讲解 Java Agent 的使用及实现代码。 什么是 Java Agent Java Agent 是...
javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控。相比于NewRelic或者开源的,以及阿里的,本工具主打的是简单,我们只记录每个方法的执行...
在本文中,我们将深入探讨Javassist如何实现代码注入,并结合实例`HotPatchDemo`来展示其实现过程。 首先,理解代码注入的基本概念是必要的。代码注入是一种技术,允许在程序运行时向现有代码中插入新的行为或修改...
JavaAgent 示例说明 ①、 javassist.iedis.crack.IedisCrack1和javassist.iedis.crack.IedisCrack2为使用...javaagent.sample.transformer.InjectPrintTransformer 演示了使用javaagent结合javassist匹配返回值为St
JavaAgent是Java平台提供的一种机制,可以用来在类加载时或虚拟机启动时注入自定义的行为。这通常涉及到字节码增强,即在程序运行之前或运行时修改类的字节码,以添加新的功能或改变现有行为。这种技术在性能监控、...
Java Agent 和 Javaassist 是在 Java 应用程序中实现非侵入式监控和埋点的关键技术。Java Agent 提供了一种在类加载到 JVM 之前进行拦截和修改的能力,而 Javaassist 是一个开源库,允许我们动态地修改字节码,使得...
本文将深入探讨如何使用Java Agent来实现系统数据采集。 首先,我们需要了解Java代理(Agent)的工作原理。在Java中,Agent是通过Java instrumentation API实现的,这个API提供了对已加载类进行操作的能力。`java....
在Java Agent的实现中,`javassist`可以帮助我们在运行时检查和修改类的字节码,比如添加方法、修改方法体、插入监控代码等。通过`javassist.CtClass`和`javassist.CtMethod`等类,我们可以方便地操作Java类和方法。...
所以,在MVC模型里,Model不依赖于View,但是如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。 MVP时代:在MVP里,Presenter完全把模型和视图进行了分离,...
Java反编译工具JBoss Javassist是一款强大的Java...遇到问题时,可以查阅Javassist的官方文档,或者在相关的论坛和社区寻求帮助。Javassist是一个强大而灵活的工具,熟练掌握它将极大地提升开发效率和解决问题的能力。
结合使用 `javassist` 和 `jd-gui`,开发者可以实现诸如动态代理、日志插桩、性能监控等功能,同时在遇到无法获取源码的库时,`jd-gui` 可以帮助解析其内部逻辑。这种组合为Java开发者提供了一套强大的工具集,能够...
通过以上步骤,我们不仅了解了 Java Agent 的基本概念和应用场景,还深入学习了如何实现一个简单的 Java Agent。Java Agent 的强大之处在于它能够在不修改源代码的情况下对现有应用程序进行增强,这在生产环境中对于...
它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...