热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?

如何解决《使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?》经验,有好办法吗?

问题如下; Java代码中的方法是:

Rule foo()
{
    return sequence(foo(), x());
}

这将引发解析循环,当然应该避免; 但是,是合法的:

Rule foo()
{
    return sequence(x(), foo());
}

现在,代码中的其他地方我可以访问a RuleMethod,这是一个扩展的类MethodNode,因此我可以访问以下信息:

ruleMethod.name:foo; (定义于MethodNode)

ruleMethod.desc:( ()Lorg/parboiled/Rule;定义于MethodNode)

ruleMethod.ownerClass:( com.github.fge.grappa.experiments.SelfReferringRule.MyParser定义于RuleMethod

上面第一个代码提取的字节码如下:

Method 'foo':
 0    L0
 1     ALOAD 0
 2     ALOAD 0
 3     INVOKEVIRTUAL com/github/fge/grappa/experiments/SelfReferringRule$MyParser.foo ()Lorg/parboiled/Rule;
 4     ALOAD 0
 5     INVOKEVIRTUAL com/github/fge/grappa/experiments/SelfReferringRule$MyParser.x ()Lorg/parboiled/Rule;
 6     ICONST_0
 7     ANEWARRAY java/lang/Object
 8     INVOKEVIRTUAL com/github/fge/grappa/experiments/SelfReferringRule$MyParser.sequence (Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/parboiled/Rule;
 9     ARETURN
10    L1

这意味着我必须提供给我的每一个信息,能够发现,至少在上面的字节码,这foo()第一个参数的的sequence()调用,因为构造函数接受三个参数,并有在堆栈上三个要素.

但当然我不能在运行时"眼睛检查".因此我需要一种方法来做到这一点......

看起来我需要的是a MethodVisitor和some visitInsn(),然后看看有什么参数并适当检测......

但我没有任何想法从哪里开始; 在网上搜索似乎只是举例说明如何修改字节码,而不是检测这种情况:/

我从哪里开始?


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 1.javap反汇编工具javap是jdk自带的反汇编工具,可以通过该命令查看编译后的class文件的常量池、字段以及方法等信息。对于下面的这个类:pu ... [详细]
  • 【JVM原理探索,阿里内部核心Java进阶手册
    #17NameAndType#5:#6simpleField:I#18Utf8LSimpleClass;#19Utf8javalangObject###[](https:codec ... [详细]
  • 如何解决《为什么有JVM指令`monitorenter/monitorexit`但没有`wait/notifyAll`(它们是本机调用)?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《何时何地在Java源代码中初始化/存储String?》经验,如何解决这个问题? ... [详细]
  • 如何解决《错误的堆栈大小由ASM库计算》经验,为你挑选了1个好方法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 如何解决《错误:代码太大》经验,求大佬解答? ... [详细]
  • 如何解决《为什么OpenJDK将私有方法放入vtable?》经验,谁能帮忙解答一下? ... [详细]
  • 如何解决《java编译器是否汇编?》经验,为你挑选了1个好方法。 ... [详细]
  • SoIhaveaMethod所以我有一个方法publicmodifiersFoofoo(Barbar){blah;blah;veryInterest ... [详细]
author-avatar
手机用户2602933165
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有