Java类文件StackMap能否使覆盖super()的构造器异常处理器通过验证?
关于构造器中try-catch与StackMap的验证问题
无法使用StackMap创建覆盖整个构造器(包括super(…))的异常处理器。
我基本认同上述表述,但仍有疑问,因为后续的一条评论提到:
通常,栈帧无需描述之前代码中的内容,只需描述后续代码会用到的内容。
这让我觉得StackMap或许可以省略this实例,只要异常处理器代码不访问它,就能通过验证。具体来说,我知道无法编译以下代码,但假设可以:
public class TryCtor { public TryCtor() { try { super(); } catch (Error e) { throw new RuntimeException(); } } }
注意,异常处理器中完全没有引用this。对应的类文件字节码如下:
public class TryCtor { TryCtor(); descriptor: ()V Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: goto 16 7: astore_1 8: new #9 // class java/lang/RuntimeException 11: dup 12: invokespecial #11 // Method java/lang/RuntimeException."<init>":()V 15: athrow 16: return Exception table: from to target type 0 4 7 Class java/lang/Error }
因此我的问题是:是否可以确定不存在任何StackMap能让此类文件通过验证? 即使指定top、空栈或其他类型?本问题基于使用StackMap的现代JVM版本。
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

