Eclipse的Java编译器只是程序所在的同一个核心的包装器javac,还是一个单独的编译器?如果是后者,为什么他们会重新发明轮子?
使用相同的JDK(即相同的javac可执行文件)时,生成的类文件是否始终相同?可能会有所不同,具体取决于操作系统或硬件?除JDK版本外,是否还有其他因素导致差异?是否有任何编译器选项可以避免差异?仅在理论上可能存在差异,或者Oracle是否javac实际为相同的输入和编译器选项生成不同的类文件?
更新1我对生成感兴趣,即编译器输出,而不是类文件是否可以在各种平台上运行.
更新2通过'相同的JDK',我也意味着相同的javac可执行文件.
更新3 Oracle编译器中理论差异与实际差异的区别.
[编辑,添加释义问题]
"在不同的平台上运行相同的javac可执行文件会产生不同的字节码的情况是什么?"
我的同事建议将几个Eclipse代码格式和警告设置更严格.这些变化中的大多数都是有意义的,但我在Java中得到了一个奇怪的警告.这里有一些重现"问题"的测试代码:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); // !!!
this.anInstance.doSomething();
}
}
// using "this.anInstance" instead of "anInstance" prevents another warning,
// Unqualified access to the field WeirdInnerClassJavaWarning.anInstance
Run Code Online (Sandbox Code Playgroud)
与!!!线!使用我的新警告设置在Eclipse中向我发出此警告:
对包含构造函数WeirdInnerClassJavaWarning.InnerClass()的访问由合成访问器方法模拟.提高其可见性将改善您的表现.
这是什么意思?当我将"私有静态类"更改为"受保护的静态类"时,警告就消失了,这对我来说毫无意义.
编辑:我终于找到了"正确"修复.这里真正的问题似乎是这个嵌套的私有静态类缺少一个公共构造函数.那一个调整删除了警告:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
public InnerClass() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); …Run Code Online (Sandbox Code Playgroud) 给定相同的主要版本,比如Java 7,做不同的Java编译器(例如,Oracle的热点,JRockit或IBM的J9等......)将给定的java源代码文件编译成相同的bytcode?
扫描Java 7语言规范似乎正在讨论的是语言的语义,而不是将代码转换为字节码.
这个问题与不同的major.minor版本不同,给定供应商生成相同的字节码.这个问题已在这里得到解答- 可能是.
从以下答案到Java类文件的创建是否确定?和这个问题的答案是指评论此沿侧两个答案上述问题MAJOR.MINOR 1和2,我收集了答案,我的问题是YES.
上述摘录如下:
JLS留下了许多实现细节,从一个实现到另一个实现.
和
但是,JLS没有指定从源代码到生成的字节代码的1:1映射,因此您不应该依赖于生成完全相同的字节代码.
然而,这里的评论意味着不同:
它是编译器,即javac,使用BLAH BLAH BLAH创建代码.这与HotSpot无关.
这意味着给定代码X所有javac实现(相同版本/不同供应商)必须生成相同的Y字节码.
我不明白这是怎么回事,但我无法证实它不是(或者我认为,见上文)是正确的.
可以给出明确的答案吗?
鉴于这一小部分代码:
import java.util.Arrays;
public class Sample {
private final int test;
private Sample(int test) {
this.test = test;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(Hello.class.getDeclaredConstructors()));
}
public static class Hello {
private final int i;
private Hello(int i) {
this.i = i;
}
public int getI() {
return i;
}
public static class Builder {
private int i;
private Builder() {
}
public static Builder builder() {
return new Builder();
}
public void add(int i) {
this.i = i; …Run Code Online (Sandbox Code Playgroud)