自从上次实现new指令之后,我没有马上实现invokespecial指令,因为对于invokespecial指令的理解需要时间。现在基本实现了invokesecial指令,但是在权限检查上遇到一个困难,主要是派生类对于基类protected实例成员(非静态成员)的访问。这个问题暂时忽视了。接着实现了invokevirtual指令,也遇到访问权限方面的疑问。我参考“深入java虚拟机”的一个例子,这个例子测试通过了,如下。
Superclass.java
class Superclass {
private void interestingMethod() {
//System.out.println("Superclass's interesting method.");
}
void exampleMethod() {
interestingMethod();
}
}
Subclass.java
class Subclass extends Superclass {
void interestingMethod() {
//System.out.println("Subclass's interesting method.");
}
public static void main(String args[]) {
main();
}
public static void main() {
Subclass me = new Subclass();
me.exampleMethod();
}
}
用javac编译上述两个java文件,然后编译和运行虚拟机。虚拟机代码参考附件,同样这一次的版本我在visual studio以及cygwin下都编译通过。
分享到:
相关推荐
然而,`invokespecial`与`invokevirtual`、`invokestatic`和`invokeinterface`等其他方法调用指令有所不同。`invokevirtual`用于调用非私有实例方法,`invokestatic`用于调用静态方法,而`invokeinterface`则用于...
然后,`invokespecial`指令用来调用对应的构造函数初始化新对象。 2. **getfield 指令**: "getfield"指令用于从对象实例中获取一个字段的值。在Java源代码中,当我们访问一个实例变量,如 `myVariable = obj....
5. **对象创建与访问指令**:`new`用于创建一个新的对象实例,`aload`和`astore`用于对象引用的加载和存储,`getfield`和`putfield`用于读写对象字段,`invokevirtual`、`invokespecial`、`invokestatic`、`invoke...
对象操作指令涉及创建对象(如`new`),访问和调用方法(如`invokevirtual`,`invokespecial`),以及字段访问(如`getfield`, `putfield`)。数组操作指令如`iaload`加载数组中的int元素,`iastore`存储int元素到...
6. **方法调用与返回指令**:`invokevirtual`用于调用对象的虚方法,`invokespecial`用于构造函数调用和私有方法,`return`表示方法的结束。 7. **异常处理指令**:如`athrow`抛出异常,`catch`配合`try-catch`块...
9. **方法调用和返回**:`invokevirtual`用于调用实例方法,`invokespecial`用于调用构造器、私有方法和父类方法,`return`指令表示方法返回。 10. **对象创建和初始化**:`new`指令用于创建新的对象实例,` anew...
10. **方法调用与返回**:`invokevirtual`、`invokespecial`、`invokestatic` 和 `invokeinterface` 指令用于调用方法,`return` 指令结束方法执行并返回结果。 11. **异常处理**:JVM提供了异常处理框架,通过 `a...
JVM指令手册是开发者理解和运用JVM指令的重要资料,其中详细介绍了各个指令的作用、参数以及应用场景。中文版JVM指令手册为那些英语阅读有障碍的开发者提供了方便。 #### 指令分类 ##### 常量推送指令 - `iconst`...
6. **动态类型与方法调用**:JVM支持动态类型和虚方法调用,C语言实现需要处理符号引用到直接引用的转换,以及 invokevirtual 和 invokespecial 指令。 7. **异常处理**:JVM需要处理try-catch-finally语句块和异常...
这里主要讨论的是`invokestatic`、`invokespecial`、`invokevirtual`、`invokeinterface`和`invokedynamic`这五种指令。 1. `invokestatic`: 这个指令用于调用静态方法,它不需要任何特定的对象实例,因为静态方法...
`invokevirtual`、`invokespecial`、`invokestatic`、`invokeinterface`指令用于调用方法,它们根据方法的特性(虚拟、特殊、静态、接口)来区分。`return`指令则用于结束方法执行并返回结果。 5. 类加载与初始化...
7. **方法调用**:`invokevirtual`用于调用实例方法,`invokespecial`用于构造器和私有方法,`invokestatic`用于静态方法。 8. **类和对象操作**:`new`指令创建新对象,`aload_0`和`aload_1`等用于加载局部变量表...
- **方法调用指令**:如`invokevirtual`(调用实例方法)、`invokespecial`(调用构造函数或私有方法)等,处理方法调用。 5. **垃圾回收**:JVM的内存管理包括垃圾回收机制,通过`new`指令创建的对象,如果不再被...
在 Java 中,方法调用会被编译为 invokestatic、invokespecial、invokevirtual 以及 invokeinterface 四种指令。这些指令与包含目标方法类名、方法名以及方法描述符的符号引用捆绑。在实际运行之前,Java 虚拟机将...
- `invokevirtual`、`invokespecial`、`invokestatic`、`invokeinterface`:调用方法的指令,根据方法调用的类型执行。 Java字节码指令集的设计使得JVM可以高效地解释和执行代码,同时提供了跨平台兼容性。理解...
4. **类和接口操作指令**:如`aload_0`加载局部变量0(通常为this引用),`invokevirtual`调用实例方法,`invokespecial`调用构造函数或私有方法。 5. **异常处理指令**:`athrow`用于抛出一个异常,`catch`配合try...
- `invokevirtual`、`invokespecial`、`invokestatic`、`invokeinterface` 用于调用方法。 JVM指令集是Java字节码的基础,理解这些指令的含义和作用,对于优化Java代码、调试程序以及深入理解JVM的工作原理至关...
invokevirtual、invokeinterface、invokespecial和invokestatic分别处理虚拟方法调用、接口方法调用、特殊方法调用(如构造器、私有方法)和静态方法调用。ireturn、lreturn等返回指令则根据方法返回值的类型决定...
`invokevirtual`、`invokespecial`、`invokestatic`和`invokeinterface`用于调用方法。 6. **类和数组操作指令**:`checkcast`用于类型检查转换,`instanceof`检查对象是否是特定类或其子类的实例。` anewarray`...