首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java7中,javac栈帧操作数验证类型可以在类加载时被禁用或忽略吗?

在java7中,javac栈帧操作数验证类型可以在类加载时被禁用或忽略吗?
EN

Stack Overflow用户
提问于 2016-04-22 13:04:41
回答 2查看 87关注 0票数 0

我面临的问题可以归结为这个简单的例子。用Oraclejava7JDK编译它,然后尝试用IBM 7或jre 8运行它。在java.lang.AbstractStringBuilder上运行NoClassDefFoundError失败。

代码语言:javascript
复制
package org.example;

public class Example {
    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("got it") ;
        System.out.println(" works "+sb);

        StringBuilder sb2 = new StringBuilder("other") ;
        sb2.append("killer") ;
        sb2.length() ;
        System.out.println("builder  "+sb2);

        System.out.println( sb == null ? sb2 : sb); 
    }
}

http://chrononsystems.com/blog/java-7-design-flaw-leads-to-huge-backward-step-for-the-jvm相关,Java7编译器将堆栈帧添加到字节码中,其中包括对堆栈操作数的类型验证。

使用Oracle jdk编译的此示例的字节代码包括:

代码语言:javascript
复制
frame_type = 255 /* full_frame */
      offset_delta = 0
      locals = [ class "[Ljava/lang/String;", class java/lang/StringBuffer, class java/lang/StringBuilder ]
      stack = [ class java/io/PrintStream, class java/lang/AbstractStringBuilder ]

而来自IBM jdk编译器的字节码是:

代码语言:javascript
复制
frame_type = 255 /* full_frame */
      offset_delta = 0
      locals = [ class "[Ljava/lang/String;", class java/lang/StringBuffer, class java/lang/StringBuilder ]
      stack = [ class java/io/PrintStream, class java/io/Serializable ]

来自Oracle的栈帧解析为基类AbstractStringBuilder类。那个类在IBM rt.jar中不存在。我们在构建过程中使用Oracle JDK &我不愿意改变这一点。这种Java7类型验证似乎创建了不可移植的字节码。有没有办法在编译时或运行时禁用这种类型验证检查?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-04-22 13:18:03

为什么要尝试在不同的供应商中编译和运行Java?我看到进口是不同的。可能有什么地方出了问题。Oracle JDK也有StringBuilder

尝试使用java.lang.StringBuilder而不是StringBuilder,并分享您得到的输出。

代码语言:javascript
复制
java.lang.StringBuffer sb = new java.lang.StringBuffer("got it") ;
System.out.println(" works "+sb);

java.lang.StringBuilder sb2 = new  java.lang.StringBuilder("other") ;
票数 0
EN

Stack Overflow用户

发布于 2016-05-18 13:23:34

感谢您的建议和帮助。在发布了这篇文章后,我们找到了根本原因。在将类打包到我们的应用程序之前,我们使用了一个较旧版本的aspect-j来检测这些类。对不起,我从来没有找到为什么方面j插装添加AbstractStringBuilder到修改后的类文件。我们不再需要aspect-j。所以去掉它就解决了这个问题。

谢谢你的帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36785240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档