如何识别Java字节码中的覆盖方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何识别Java字节码中的覆盖方法?相关的知识,希望对你有一定的参考价值。

我现在专注于需要深入了解Java字节代码的项目。

bcel的帮助下,我现在可以完成大部分工作。我现在不清楚的一点是如何识别子类方法覆盖其基本代码? .class文件中是否记录了与指示此重写关系的方法相关联的属性,或者我应该返回其基类可以比较方法签名?

任何提示将受到高度赞赏。

答案

您需要查找层次结构链 - 字节代码中没有任何内容表明它是一个被重写的方法,因为不需要。

另一答案

如果你不能依赖@Override属性那么似乎根据the spec,没有别的方法可以通过查看课程来了解。我想你需要看一下超类。

另一答案

不幸的是,你无法从字节码中分辨出来。注释@Override只是一个建议 - 它不是强制性的。

JVM定义了5种调用方法的方法。它们是invokevirtual,invokeinterface,invokespecial,invokestatic和新的invokedynamic。

专注于invokevirtual - 这是最常见的调度形式,是你在这里谈论的案例。

invokevirtual的工作方式是在运行时它查看您要调度的对象的类。如果它找到我们所追求的方法的实现,那么它会调用它。如果没有,那么它会查看对象类的超类并再次尝试,依此类推。

因此,在没有查看父类的字节码的情况下,字节码无法可靠地判断给定方法是否被覆盖。

另一答案

编译后生成字节代码。因此,它仅假定基于引用变量调用方法,因为尚未创建对象。

另一答案

您可以对其进行反编译,并将代码作为项目加载到您选择的IDE中。通常,您可以轻松地从继承类跳转到重写的方法。

以上是关于如何识别Java字节码中的覆盖方法?的主要内容,如果未能解决你的问题,请参考以下文章

检测 Java 字节码中的循环 - 区分后端类型

字节码中的类型

java 反编译

反射机制

Android 逆向启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )

Java字节码中“GOTO”之后的数字是多少?