是否可以为应该抛出检查异常的方法编写字节代码?
例如,除非该方法声明它抛出已检查的异常,否则以下 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 字节码包含方法上已检查的异常规范,但在执行任何字节码之前运行的字节码验证程序不会检查方法是否实际上符合异常规范。您可以编写一个程序,采用现有的 JVM 字节码并删除所有异常规范,并且生成的字节码将完全有效并且与原始字节码相同地运行(除非反射)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)