From 46e57beb9f1dae951a007e5eabeaf621a8556151 Mon Sep 17 00:00:00 2001 From: wangxiang <276644985@qq.com> Date: Tue, 25 Jul 2023 18:17:15 +0800 Subject: [PATCH] =?UTF-8?q?update=20INVOKEINTERFACE=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=BB=A7=E6=89=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../references/INVOKEINTERFACE.java | 20 ++++++++++++++----- .../java/haidnor/jvm/test/clazz/Organism.java | 6 +----- .../haidnor/jvm/test/clazz/Organism0.java | 12 +++++++++++ .../java/haidnor/jvm/test/demo/Demo8.java | 4 ++-- 4 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 src/test/java/haidnor/jvm/test/clazz/Organism0.java diff --git a/src/main/java/haidnor/jvm/instruction/references/INVOKEINTERFACE.java b/src/main/java/haidnor/jvm/instruction/references/INVOKEINTERFACE.java index 360dd6f..d583bda 100644 --- a/src/main/java/haidnor/jvm/instruction/references/INVOKEINTERFACE.java +++ b/src/main/java/haidnor/jvm/instruction/references/INVOKEINTERFACE.java @@ -22,9 +22,7 @@ import org.apache.bcel.classfile.Utility; import java.lang.reflect.Method; import java.util.Objects; -/** - * 调用对象实例方法,根据对象的实际类型进行分派(虚方法分派),支持多态 - */ + public class INVOKEINTERFACE extends Instruction { private final int constantMethodrefIndex; @@ -132,13 +130,25 @@ public class INVOKEINTERFACE extends Instruction { private static org.apache.bcel.classfile.Method getMethodFromInterface(JavaClass javaClass, String methodSignature, String methodName) throws ClassNotFoundException { JavaClass[] interfaces = javaClass.getInterfaces(); - for (JavaClass anInterface : interfaces) { - for (org.apache.bcel.classfile.Method method : anInterface.getMethods()) { + if (interfaces.length == 0) { + for (org.apache.bcel.classfile.Method method : javaClass.getMethods()) { if (method.getSignature().equals(methodSignature) && method.getName().equals(methodName)) { return method; } } } + for (JavaClass interfaceJavaClass : interfaces) { + for (org.apache.bcel.classfile.Method method : interfaceJavaClass.getMethods()) { + if (method.getSignature().equals(methodSignature) && method.getName().equals(methodName)) { + return method; + } + } + if (interfaceJavaClass.getInterfaces() != null) { + for (JavaClass classInterface : interfaceJavaClass.getInterfaces()) { + return getMethodFromInterface(classInterface, methodSignature, methodName); + } + } + } return null; } diff --git a/src/test/java/haidnor/jvm/test/clazz/Organism.java b/src/test/java/haidnor/jvm/test/clazz/Organism.java index 3ecfe15..3e6f9b1 100644 --- a/src/test/java/haidnor/jvm/test/clazz/Organism.java +++ b/src/test/java/haidnor/jvm/test/clazz/Organism.java @@ -3,10 +3,6 @@ package haidnor.jvm.test.clazz; /** * 生物 */ -public interface Organism { - - default void die() { - System.out.println("Organism die"); - } +public interface Organism extends Organism0 { } diff --git a/src/test/java/haidnor/jvm/test/clazz/Organism0.java b/src/test/java/haidnor/jvm/test/clazz/Organism0.java new file mode 100644 index 0000000..fd9a393 --- /dev/null +++ b/src/test/java/haidnor/jvm/test/clazz/Organism0.java @@ -0,0 +1,12 @@ +package haidnor.jvm.test.clazz; + +/** + * 生物 + */ +public interface Organism0 { + + default void die() { + System.out.println("Organism die 0"); + } + +} diff --git a/src/test/java/haidnor/jvm/test/demo/Demo8.java b/src/test/java/haidnor/jvm/test/demo/Demo8.java index e5af23f..1ce2ed1 100644 --- a/src/test/java/haidnor/jvm/test/demo/Demo8.java +++ b/src/test/java/haidnor/jvm/test/demo/Demo8.java @@ -2,14 +2,14 @@ package haidnor.jvm.test.demo; import haidnor.jvm.test.clazz.Human; -import haidnor.jvm.test.clazz.Organism; +import haidnor.jvm.test.clazz.Organism0; import haidnor.jvm.test.clazz.Student; public class Demo8 { public static void main(String[] args) { Human organism1 = new Human(); - Organism organism = new Student(); + Organism0 organism = new Student(); organism.die(); }