gpt4 book ai didi

java - 使用字节码检测java代码中的 "super"单词

转载 作者:行者123 更新时间:2023-12-02 06:27:35 26 4
gpt4 key购买 nike

我目前正在尝试计算java程序中 super 调用的数量。换句话说,我想计算给定代码中“super”的数量。我尝试使用操作码中的 invokespecial 方法,但问题是它会计算单词“super”的其他情况
不存在。

我将非常感谢任何帮助,这个问题一直是一个巨大的痛苦!

//编辑我想计算 super.something 的情况,而不仅仅是 super();来电

最佳答案

super严格来说是Java语言级别的标识符;字节码中没有直接等效的内容。

查找类似 super.method() 的调用站点,您可以查找invokespecial满足以下条件的指令:

  1. 目标方法不是构造函数(即未命名 <init> )。
  2. 目标方法的声明类型不是当前类型(以过滤掉私有(private)方法)。
  3. 调用站点不在静态方法中(见下文)。

第 #3 项应该处理误报,例如当原始代码具有 OuterClass.this.privateMethod() 形式的表达式时出现的误报。 。在这种情况下,编译器将发出一个使用 invokespecial 的静态访问器方法。调用privateMethod()OuterClass上实例,而您不想包含这些。

如果您想包含super()构造函数调用,您需要查找 invokespecial构造函数内的指令调用另一个构造函数;你可以过滤掉this()通过将调用的构造函数的声明类型与当前类型进行比较来进行调用。

您无法可靠地确定 super.field 何时出现在原始来源中明确使用,因为它在语义上等同于 this.field在许多情况下(甚至是不合格的访问)。如果您想包含任何父类(super class)字段访问,您只需将字段的声明类型与任何 getfield 的当前类型进行比较即可。和putfield指示。否则,您能做的最好的事情就是确定 super.field 所在的位置。 必须已被使用,即目标字段被当前类中的同名字段隐藏的任何字段访问。

如果您想检测 OuterClass.super.privateMethod() 形式的访问,那么你就会遭受一些痛苦。编译器为这些生成静态访问器方法,而约定是编译器的实现细节,因此可靠地识别它们并非易事。您还必须分析生成的方法,以验证调用的方法的声明类型与实例参数类型不匹配(假设编译器实际上将参数键入为 OuterClass 而不是直接替换其父类(super class))。如果代码被混淆了,那就算了。

关于java - 使用字节码检测java代码中的 "super"单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com