我正在编写我的第一个java代理。我正在尝试仪器一个项目,我从git repo(不是由我开发的)挑选。
我已经用premain方法编写了代理类,并实现了一些日志记录(使用ASM字节码操作框架记录执行的行数)
然而,我发现即使是内置的java函数调用/类也被检测,这是不正确的。我只想要我的项目中的文件被仪器化。为了实现这一点,我添加了一个过滤器,如下所示-
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Premain called");
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader classLoader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] bytes)throws IllegalClassFormatException {
// ASM Code
if(className.startsWith("org/mytestpackage/")){
ClassReader reader = new ClassReader(bytes);
ClassWriter writer = new ClassWriter(reader, 0);
ClassTransformVisitor visitor = new ClassTransformVisitor(writer);
reader.accept(visitor, 0);
return writer.toByteArray();
}
return null;
}
});
}
在我添加了这个过滤器之后,premain被调用了,但是我得到了一些异常
initializationError(org.mytestpackage.TestAllPackages) Time elapsed: 0.002 sec <<< ERROR!
java.lang.VerifyError: (class: org/mytestpackage/TestAllPackages, method: main signature: ([Ljava/lang/String;)V) Stack size too large
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
在添加这个过滤器(如果条件基于className)之前,我能够看到内部java类和方法的逻辑工作。如果添加筛选器后失败。
您的classtransformVisitor
似乎破坏了您转换后的案例的代码。在您的特定情况下,似乎不会调整org.myTestPackage.testAllPackages
类中方法的堆栈大小。
验证器错误stack size too large
表示您向方法的操作数堆栈中推送的值比为该堆栈指定的插槽多。您可以通过指定new ClassWriter(reader,ClassWriter.compute_maxs)
来要求ASM为您修复此问题。
本文向大家介绍Java删除指定文件夹下的所有内容的方法(包括此文件夹),包括了Java删除指定文件夹下的所有内容的方法(包括此文件夹)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Java删除指定文件夹下的所有内容的方法(包括此文件夹) 就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
我正在使用meanstack应用程序。所以我有mongodb系列,其中包含全球各地的位置。模式loook如下所示。 选择圆内所有点(预定义点和预定义半径)的有效方法是什么。。?? 使用SQL查询也可以做到这一点。但我想要一种有效的方法,不需要逐个迭代,检查它是否在该半径内。
我比第一个更喜欢它,因为: 您可以直接在顶部输入您的文件路径 您可以搜索文件夹 左边的直接访问包含整个文件树 如何在 Java 中获取它?
我在让我的排序检查每个索引时遇到问题。它跳过了的第三个索引,因为它去了,,到,我不知道它为什么这样做?。此外,我的数字实际上被交换时遇到了问题。有人知道我的错误在哪里吗?
预期:[硬币[价值=1.0,名称=美元],硬币[价值=0.25,名称=四分之一],硬币[价值=0.1,名称=一角硬币],硬币[价值=0.05,名称=镍],硬币[价值=0.01,名称=便士]]
假设当前存在一个 int 类型的数组 number,该数组中的元素依次是 13、15、 24、99、4 和 1。如果使用冒泡排序进行两两相邻比较,第一趟排序后的结果如下: 第二趟排序后的结果如下: 第三趟排序后的结果如下: 第四趟排序后的结果如下: 第五趟排序后的结果如下: 使用选择排序法也可以对上述数组中的元素进行排序,但是它与冒泡排序不同。 选择排序是指每一趟从待排序的数据元素中选出最大(或最