gpt4 book ai didi

java - Scala 生成的字节码如何丢弃已检查的异常?

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:19 25 4
gpt4 key购买 nike

是否可以为应该抛出已检查异常的方法编写字节码?

例如,除非方法声明它抛出已检查的异常,否则以下 Java 类不会编译:

public class CheckedExceptionJava {
public Class<?> testChecked(String s) throws ClassNotFoundException {
return Class.forName(s);
}
}

虽然下面的 Scala 等效项(因为 Scala 没有已检查的异常):

class CheckedException { 
def testChecked( s : String ) = Class.forName( s )
}

即使生成的字节码几乎相同:

Compiled from "CheckedExceptionJava.java"
public class CheckedExceptionJava extends java.lang.Object{
public CheckedExceptionJava();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public java.lang.Class testChecked(java.lang.String) throws java.lang.ClassNotFoundException;
Code:
0: aload_1
1: invokestatic #2; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
4: areturn

}

Compiled from "CheckedException.scala"
public class CheckedException extends java.lang.Object implements scala.ScalaObject{
public CheckedException();
Code:
0: aload_0
1: invokespecial #24; //Method java/lang/Object."<init>":()V
4: return

public java.lang.Class testChecked(java.lang.String);
Code:
0: aload_1
1: invokestatic #11; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
4: areturn

}

问题:是否有可能(以及如何)为不标记它抛出已检查异常的字节码生成字节码,即使该方法中的代码不处理它也是如此?

最佳答案

简单。虽然 JVM 字节码包括方法的已检查异常规范,但在执行任何字节码之前运行的字节码 validator 并不会检查这些方法是否确实符合异常规范。您可以编写一个采用现有 JVM 字节码并删除所有异常规范的程序,生成的字节码将完全有效并且运行方式与原始字节码相同(反射除外)。

关于java - Scala 生成的字节码如何丢弃已检查的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337281/

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