如果我打开使用Javac生成调试信息,则类文件大20-25%.这对运行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 ..
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吗?
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)
我的Java理论的理解说没有!
知道JLS对它的评价会很有趣.
我有一个编译我的程序的Ant文件.如果编译器报告任何警告,我希望javac任务失败.有关如何做到这一点的任何线索?
请考虑以下代码
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静态编译器(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的这种内联行为?对于后台,我们正在考虑进行字节码分析以实现依赖性目的,并且它是字节码分析无法检测编译时依赖性的少数情况之一.谢谢!
编辑:这是一个棘手的问题,因为通常我们不控制所有源(例如,定义常量的第三方库).我们有兴趣从使用常量的角度检测这些依赖关系.由于引用是从使用常量的代码中删除的,因此没有简单的方法来检测它们,缺少源代码分析.
如果我尝试将 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 相同。
我用的IntelliJ IDEA 10和Java JDK 6更新7工作当我运行Build --> Rebuild Project命令和文件(javac)编译器会产生警告,理念不显示什么这些警告究竟是在Messages视图.我只看到一个"信息:XX警告"节点,但无法扩展它以查看实际警告.或者我只是在状态栏上看到"编译已成功完成XX警告"消息.对于错误,Idea会自动显示错误信息(错误消息,文件名,行号等).如何让它与警告类似地工作?
(为了记录,我已经尝试过使用其他命令行参数-Xlint,但它没有什么区别.)
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 …
当我编译时,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似乎没有帮助.