标签: javac

Javac调试开启和关闭是否有性能差异?

如果我打开使用Javac生成调试信息,则类文件大20-25%.这对运行Java程序有任何性能影响吗?如果是,在哪些条件和多少.我希望对加载类有一点影响,因为文件较大但这应该是最小的.

java debugging performance javac

60
推荐指数
3
解决办法
2万
查看次数

什么是1美元的类文件名?

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 Volume in drive C has no label.
 Volume Serial Number is 2041-64E7

 Directory of C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet

2009-07-02  23:54              .
2009-07-02  23:54              ..
2004-09-06  14:57               582 WelcomeApplet.html
2004-09-06  15:04             1,402 WelcomeApplet.java
               2 File(s)          1,984 bytes
               2 Dir(s)   2,557,210,624 bytes free

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>javac WelcomeApplet.java

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 Volume in drive C has no label.
 Volume Serial Number is 2041-64E7

 Directory of C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet

2009-07-02  23:54              .
2009-07-02  23:54              ..
2009-07-02  23:54               975 WelcomeApplet$1.class
2009-07-02  23:54             1,379 WelcomeApplet.class
2004-09-06 …

java javac anonymous-class

59
推荐指数
4
解决办法
6万
查看次数

这是有效的Java吗?

这是有效的Java吗?

import java.util.Arrays;
import java.util.List;

class TestWillThatCompile {

    public static String f(List<String> list) {
        System.out.println("strings");
        return null;
    }

    public static Integer f(List<Integer> list) {
        System.out.println("numbers");
        return null;
    }

    public static void main(String[] args) {
        f(Arrays.asList("asdf"));
        f(Arrays.asList(123));
    }

}
Run Code Online (Sandbox Code Playgroud)
  • Eclipse 3.5说是的
  • Eclipse 3.6说没有
  • Intellij 9说是的
  • Sun javac 1.6.0_20说是的
  • GCJ 4.4.3说
  • GWT编译器说是的
  • 人群在我之前的Stackoverflow问题上没有

我的Java理论的理解说没有!

知道JLS对它的评价会很有趣.

java generics gcj javac

59
推荐指数
5
解决办法
3491
查看次数

Javac:将警告视为错误

我有一个编译我的程序的Ant文件.如果编译器报告任何警告,我希望javac任务失败.有关如何做到这一点的任何线索?

java ant warnings javac

58
推荐指数
1
解决办法
1万
查看次数

JDK8和JDK10上三元运算符的行为差异

请考虑以下代码

public class JDK10Test {
    public static void main(String[] args) {
        Double d = false ? 1.0 : new HashMap<String, Double>().get("1");
        System.out.println(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

在JDK8上运行时,此代码会打印,null而在JDK10上会生成此代码NullPointerException

Exception in thread "main" java.lang.NullPointerException
    at JDK10Test.main(JDK10Test.java:5)
Run Code Online (Sandbox Code Playgroud)

除了JDK10编译器生成的两个与自动装箱相关的附加指令外,编译器生成的字节码几乎完全相同,并且似乎负责NPE.

15: invokevirtual #7                  // Method java/lang/Double.doubleValue:()D
18: invokestatic  #8                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
Run Code Online (Sandbox Code Playgroud)

这种行为是JDK10中的错误还是故意更改以使行为更严格?

JDK8:  java version "1.8.0_172"
JDK10: java version "10.0.1" 2018-04-17
Run Code Online (Sandbox Code Playgroud)

java unboxing javac java-8 java-10

57
推荐指数
2
解决办法
3514
查看次数

是否可以禁用javac的静态最终变量内联?

Java静态编译器(javac)内联一些静态最终变量,并将值直接带到常量池.请考虑以下示例.A类定义了一些常量(公共静态最终变量):

public class A {
    public static final int INT_VALUE = 1000;
    public static final String STRING_VALUE = "foo";
}
Run Code Online (Sandbox Code Playgroud)

B类使用以下常量:

public class B {
    public static void main(String[] args) {
        int i = A.INT_VALUE;
        System.out.println(i);
        String s = A.STRING_VALUE;
        System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译类B时,javac从类A获取这些常量的值,并在B.class中内联这些值.结果,编译时必须从A类中删除的依赖关系B从字节码中删除.这是一种相当奇特的行为,因为您在编译时正在烘焙这些常量的值.你会认为这是JIT编译器在运行时可以做的最容易的事情之一.

是否有任何方法或任何隐藏的编译器选项可以禁用javac的这种内联行为?对于后台,我们正在考虑进行字节码分析以实现依赖性目的,并且它是字节码分析无法检测编译时依赖性的少数情况之一.谢谢!

编辑:这是一个棘手的问题,因为通常我们不控制所有源(例如,定义常量的第三方库).我们有兴趣从使用常量的角度检测这些依赖关系.由于引用是从使用常量的代码中删除的,因此没有简单的方法来检测它们,缺少源代码分析.

java dependencies bytecode javac

53
推荐指数
4
解决办法
7453
查看次数

为什么 javac 允许一些不可能的强制转换而不是其他的?

如果我尝试将 a 转换String为 a java.util.Date,Java 编译器会捕获错误。那么为什么编译器不将以下内容标记为错误呢?

List<String> strList = new ArrayList<>();                                                                      
Date d = (Date) strList;
Run Code Online (Sandbox Code Playgroud)

当然,JVMClassCastException在运行时抛出 a ,但编译器不会标记它。

行为与 javac 1.8.0_212 和 11.0.2 相同。

java casting compiler-errors javac

53
推荐指数
2
解决办法
2230
查看次数

如何让Intellij Idea显示编译警告?

我用的IntelliJ IDEA 10和Java JDK 6更新7工作当我运行Build --> Rebuild Project命令和文件(javac)编译器会产生警告,理念不显示什么这些警告究竟是在Messages视图.我只看到一个"信息:XX警告"节点,但无法扩展它以查看实际警告.或者我只是在状态栏上看到"编译已成功完成XX警告"消息.对于错误,Idea会自动显示错误信息(错误消息,文件名,行号等).如何让它与警告类似地工作?

(为了记录,我已经尝试过使用其他命令行参数-Xlint,但它没有什么区别.)

javac intellij-idea compiler-warnings

51
推荐指数
1
解决办法
4万
查看次数

为什么Java编译器11使用invokevirtual来调用私有方法?

When compiling the code below with the Java compiler from OpenJDK 8, the call to foo() is done via an invokespecial, but when OpenJDK 11 is used, an invokevirtual is emitted.

public class Invoke {
  public void call() {
    foo();
  }

  private void foo() {}
}
Run Code Online (Sandbox Code Playgroud)

Output of javap -v -p when javac 1.8.0_282 is used:

  public void call();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #2      // Method foo:()V
         4: return
Run Code Online (Sandbox Code Playgroud)

Output …

java jvm javac java-8 java-11

51
推荐指数
2
解决办法
1446
查看次数

如何抑制有关弃用api的javac警告?

当我编译时,javac输出:

Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.`
Run Code Online (Sandbox Code Playgroud)

我希望压制这个警告.尝试-Xlint:none似乎没有帮助.

java javac compiler-warnings

50
推荐指数
5
解决办法
8万
查看次数