update INVOKEINTERFACE 支持接口继承

This commit is contained in:
wangxiang
2023-07-25 18:17:15 +08:00
parent ccdcc1340e
commit 46e57beb9f
4 changed files with 30 additions and 12 deletions

View File

@@ -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;
}

View File

@@ -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 {
}

View File

@@ -0,0 +1,12 @@
package haidnor.jvm.test.clazz;
/**
* 生物
*/
public interface Organism0 {
default void die() {
System.out.println("Organism die 0");
}
}

View File

@@ -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();
}