jjzjj

INSTRUMENTATION

全部标签

java - 插入 Java 编译器

我有一个后编译步骤,用于操作生成类的Java字节码。我想让图书馆消费者的生活尽可能轻松,所以我正在寻找方法让这个过程自动化,并且(如果可能的话)与编译器无关。AnnotationProcessingAPI提供许多所需的功能(自动服务发现;由Eclipse支持)。不幸的是,这是针对代码生成器和doesn'tsupportmanipulationofexistingartefacts:Theinitialinputstothetoolareconsideredtobecreatedbythezerothround;therefore,attemptingtocreateasourceorc

java - 检测类文件时出错 (asm.ClassWriter.getCommonSuperClass)

检测错误java.lang.RuntimeException:java.lang.ClassNotFoundException:Depositatorg.objectweb.asm.ClassWriter.getCommonSuperClass(UnknownSource)atorg.objectweb.asm.ClassWriter.a(UnknownSource)atorg.objectweb.asm.Frame.a(UnknownSource)atorg.objectweb.asm.Frame.a(UnknownSource)atorg.objectweb.asm.MethodW

java - 动态字节码检测 - 问题

我有一个我无法解决的问题。假设我们有以下两个类和继承关系:publicclassA{}publicclassBextendsA{publicvoidfoo(){}}我想检测额外的代码,如下所示:publicclassA{publicvoidprint(){}}publicclassBextendsA{publicvoidfoo(){print();}}为了实现这个目标,我的实现基于java.lang.instrument包,使用带有我自己的类文件转换器的Agent。该机制也称为动态字节码检测。到目前为止小菜一碟。现在,我的测试方法执行以下操作:代码:Bb=newB();b.foo();

java - 使用 Instrumentation 记录未处理的异常

我正在尝试使用检测来调试Java应用程序。当前系统的问题是几乎没有写过任何日志语句异常处理不佳这使得追踪功能损坏的根本原因变得非常困难。为了处理这种情况,我开发了工具,使用InstrumentationAPI的java代理,我能够注入(inject)日志语句并解决了一半的问题。但下一个问题是记录异常。我想扩展我的工具记录应用程序执行期间抛出的每个异常。我尝试使用javaassistAPI为方法注入(inject)“try-catch”block(使用addCatch、insertBefore和insertAfter),并且在一定程度上是有效的。publicbyte[]transform

java - 如何检测java方法?

我想写一个简单的java代理,它可以打印被检测的java程序调用的方法的名称。例如,我要检测的java程序是:publicclassTestInstr{publicstaticvoidsayHello(){System.out.println("Hello!");}publicstaticvoidmain(Stringargs[]){sayHello();sayHello();sayHello();}}我想显示这样的东西:methodsayHellohasbeencalledHello!methodsayHellohasbeencalledHello!methodsayHellohas

java - 是否可以在 JUnit 测试中使用 java.lang.instrument.Instrumentation?

是否可以在JUnit测试中使用java.lang.instrument.Instrumentation?我正在使用mockrunner来模拟一个Servlet,并想测量session中存储的对象的大小 最佳答案 是的,这是可能的,但不是很简单。使用java.lang.instrument.Instrumentation的问题是您总是需要使用JVM代理。http://www.javabeat.net/2012/06/introduction-to-java-agents/提供了对JVM代理的很好介绍。.但是,由于您的单元测试也在jvm

java - 是否可以使用 javassist java 核心类进行检测?引导类加载器加载的类

我想在核心JDK5类的方法上添加“insertBefore”。由于某种原因,它不工作。下面是代码示例:ClassPoolpool=ClassPool.getDefault();CtClassctClass=pool.get("com.sun.org.apache.xerces.internal.impl.xs.XSMessageFormatter");CtMethodctMethod=ctClass.getDeclaredMethods()[0];ctMethod.insertBefore("System.out.println(\"WORKED\");");ctClass.toCla

java - 字节码和对象

我正在从事字节码检测项目。目前在处理对象时,validator大部分时间都会抛出错误。所以我想弄清楚有关对象规则的事情(我阅读了JVMS但找不到我正在寻找的答案):我正在检测新指令:原始字节码NEWDUPINVOKESPECIAL>检测后NEWDUPINVOKESTATICDUPINVOKESPECIAL>请注意,我添加了对Profiler.handleNEW()的调用,该调用将对象引用(新创建的对象)作为参数。上面的代码片段抛出一个VerificationError。如果我不添加INVOKESTATIC(只留下DUP),它就不会。那么我违反的规则是什么?我可以复制一个未初始化的引用但

java - 通过 JVM TI 代理将 invokestatic 添加到 java/lang/Object.<init> 会导致 JVM 因段错误而崩溃

我正在尝试跟踪JVM中所有对象的分配情况。在关于分配分析器的几个文档中提到最简单的方法是这样的:添加invokestaticTracker.trackAllocation()V指令java/lang/Object.(通常它由一条return指令组成,我们在它前面加上invokestatic,所以现在是2条指令)。(我知道这种方法很慢并且不会跟踪数组分配,但我想从最简单的解决方案开始。而且我不会将对分配对象的引用传递给跟踪器,但这将在稍后添加。)类文件在onClassLoadedHook中使用JVMTI代理进行检测。但是,添加invokestatic之后指令JVM因段错误而崩溃。Trac

java - 通过 java.lang.Object 检测数组

我目前在一个平台上工作,该平台通过ASM库大量使用动态字节码修改例程。除了数组类之外,我已经能够成功检测所有必需的系统类。(即String[]、int[]等)这是因为数组类本身是动态类型,因此据我所知,rt.jar中实际上没有类文件可供检测。但是,我确实想到,即使数组类型也扩展了java.lang.Object,所以尽管修改Object类并不理想,尤其是因为它会导致任何更改传播到所有子类,但它可能允许我间接地向数组类添加一个额外的原始字段,顺便说一下,这就是我想要实现的。除了我提到的明显注意事项之外,这是否会导致任何其他与平台相关的问题? 最佳答案