asm 5 java,java – 使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?
问题如下;
Java代码中的方法是:
Rule foo()
{
return sequence(foo(), x());
}
这将引发解析循环,当然应该避免;但是,这是合法的:
Rule foo()
{
return sequence(x(), foo());
}
现在,代码中的其他地方我可以访问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()调用的第一个参数,因为构造函数接受三个参数并且有三个元素在堆栈上.
但当然我不能在运行时“眼睛检查”.因此我需要一种方法来做到这一点……
看起来我需要的是一个MethodVisitor和一些visitInsn(),然后看看有什么参数并正确检测……
但我没有任何想法从哪里开始;在网上搜索似乎只是举例说明如何修改字节码,而不是检测这种情况:/
我从哪里开始?
asm 5 java,java – 使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?相关推荐
- java 捕获运行时异常_java-如何通过ASM在字节码中捕获运行时异常
我试图通过异常捕获运行时异常.我能够捕获通常的方法退出事件. 但是,控件永远不会到达opcode == Opcodes.ATHROW. 我认为在调用事件时做错了事. 这是我的示例代码: public ...
- java 内存情况_Java代码中获取运行时内存情况
在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...
- java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出
===============>>#1 票数:41 已采纳 使用slf4j无法做到这slf4j . 我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映 ...
- java 运行时异常 处理_如何在Java中处理运行时异常?
运行时异常是Java编程语言所有异常的父类,这些异常在发生时会崩溃或崩溃,可能会破坏程序或应用程序.与不被视为运行时异常的异常不同,永远不会检查运行时异常. "运行时异常"通常显示 ...
- java 不要使用魔法值_可别在代码中写那么多魔法值了,脑壳疼!
1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(string value) { if ("0".equals(value)) { //t ...
- JAVA异常处理、自定义异常、throws关键字与throw关键字、运行时异常
异常捕捉, try-catch语句. package YH;public class Thundering {public static void main(String[] args) {try { ...
- Java初学者作业——实现控制台的猜数字游戏。游戏运行时产生一个1~100之间的随机数字
返回本章节 返回作业目录 需求说明: (1)实现控制台的猜数字游戏.游戏运行时产生一个1-100之间的随机数字 (2)要求用户从控制台输入数字,若输入的数字比随机数小,则输出"太小了,再大一 ...
- java 不变式_solr - Solr错误:在请求处理程序中使用不变式时,QueryComponent.mergeIds(QueryComponent.java:940) - 堆栈内存溢出...
我需要一个仅在集合中返回特定字段集的搜索请求处理程序,但是出于安全原因,没有人可以更改要显示的字段. (有些索引敏感字段我不希望任何人访问它) 我试图在请求处理程序中使用不变式 ,并在那里定义字段列表 ...
- java readline最后一行_java – 如何在reader.readLine()中检测第一行和最后一行?
酷问题我打了一圈,这是一个 SSCCE,只是copy'n'paste'n'run它. package com.stackoverflow.q2292917; import java.io.Buffer ...
最新文章
- Qt OpenCV Win10环境配置
- Android开源项目源码下载(不断更新中)
- NLP/CV模型跨界,视觉Transformer赶超CNN?
- git 远程仓库版本的回退以及git reset 几种常用方式记录
- ARM WFI和WFE指令
- Struts2-EL表达式为什么能获取值栈数据
- TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!...
- 一个关于人工智能实现的讨论
- dj鲜生-22-模板抽离-列表页详情页模板的抽离-base_detail_list
- Windows Home Server 常见问题
- eclipse svn设置忽略文件
- spring 包的依赖问题
- 【HP-MC/SG】HP-MC/SG添加LV测试
- windows无法连接到user profile service服务。此问题阻止标准用户登录系统
- 这些专业是考研大户!
- element中表格展开行的默认展开和收起
- 酷炫一款动态背景(HTML +js canvas)
- 双官能交联剂点击试剂DBCO-PEG4-DBCO
- Code bloat has become astronomical
- IRIS Docker的安装
热门文章
- art-template用户注册方法
- C#中使用NPIO实现导入导出Excel简单操作
- oracle sql loop merge,Oracle之存储过程和MERGE INTO语句
- excel删除行 uipath_学会这8个Excel神技巧,轻松告别零基础!
- 关于eclipse的一些简单配置
- linux 动态库构造函数,Linux共享库全局构造函数的相互依赖性
- mysql 两字段相乘_sql统计2列相乘和语句.doc
- 钉钉电脑版如何申请调休 钉钉电脑版申请调休方法
- Win7系统设置ip地址的方法
- @Aspect中@Pointcut 12种用法