Tag: 编译器构造

如何确保不会发生jvm和编译器优化

我有这个代码测试Calendar.getInstance().getTimeInMillis() vs System.currentTimeMilli() : long before = getTimeInMilli(); for (int i = 0; i < TIMES_TO_ITERATE; i++) { long before1 = getTimeInMilli(); doSomeReallyHardWork(); long after1 = getTimeInMilli(); } long after = getTimeInMilli(); System.out.println(getClass().getSimpleName() + " total is " + (after – before)); 我想确保没有JVM或编译器优化发生,因此测试将是有效的,并且实际上会显示差异。 怎么样? 编辑 :我改变了代码示例,以便更清楚。 我在这里检查的是在不同的实现中调用getTimeInMilli()需要多长时间 – Calendar vs System。

如何在类本身内部创建类的实例?

是什么使得在类本身内部创建类的实例成为可能? public class My_Class { My_Class new_class= new My_Class(); } 我知道这是可能的并且已经自己完成了但是我仍然不能让自己相信这不是“谁是第一个 – 鸡还是鸡蛋?” 问题的类型。 我很高兴收到一个答案,从编程角度以及从JVM /编译器的角度来澄清这一点。 我认为理解这将有助于我清除OO编程的一些非常重要的瓶颈概念。 我收到了一些答案,但没有一个清楚我所期望的程度。

如何为javac设置PATH变量,以便我可以手动编译我的.java工作?

这是我的驱动器上的地址: C:\ Program Files \ Java \ jdk1.6.0_18 \ bin 我将如何设置路径变量,以便我可以进入命令窗口(windowskey + r“cmd”)并能够输入如下内容: javac TestApp.java 我正在使用Windows 7专业版。

将eclipse的java编译器改为jdk7

我正在尝试从jre6和jdk6升级到jre7和jdk7。 我使用eclipse编程,我下载并安装了jre7和jdk7:C:\ program files \ java \ now当我进入eclipse时我想改变使用的编译器所以我去:window> preferences> java> compiler但是出现了只有1.3,1.4,1.5和1.6我也输入了:window> preferences> java>安装了JRE并添加了jre7版本。 但编译器我无法改变。 如何更改我的eclipse编译器?

如何在特定于文件的基础上禁用Eclipse中的编译器警告?

在我的Eclipse项目中有一些我需要用于SQLJ的生成的.java文件,我无法移动到单独的项目(由于管理开销)。 这些文件也会定期重新生成,因此不幸的是编辑它们。 不幸的是,这些文件生成了几百个java编译器警告,这些警告淹没了我实际可以编辑的文件的有用警告。 Eclipse中是否有任何方法可以忽略所有逐个文件的警告? 或者我可以阻止特定的子目录吗?

在Java 7中使用方法重载时,为什么autoboxing不会覆盖varargs?

我们的Java项目中有一个类LogManager,如下所示: public class LogManager { public void log(Level logLevel, Object… args) { // do something } public void log(Level logLevel, int value, Object… args) { // do something else } } 在Debian下使用OpenJDK 6编译项目时,每个工作都很好。 使用OpenJDK 7时 ,构建(使用ant完成)会产生以下错误,并且构建失败: [javac] /…/LogManager.java:123: error: reference to log is ambiguous, both method log(Level,Object…) in LogManager and method log(Level,int,Object…) in LogManager match […]

如何找到已编译类的目标Java版本?

重复: 用于读取和显示Java .class版本的工具 如果我有一个已编译的Java类,有没有办法从类文件中告诉它的目标版本兼容性是什么? 具体来说,我有许多类文件,编译为Java 6,它们在Java 5下运行并给出“无法识别的版本”错误。 我希望能够在不运行JVM的情况下查看类文件并找到其目标版本兼容性。 有任何想法吗?

java中初始化字符串的大小

显然,javac中初始化字符串的大小是有限制的。 任何人都可以帮我确定最高限度是什么吗? 谢谢 编辑: 我们正在构建一个初始化字符串,它看起来像“{1,2,3,4,5,6,7,8 ……}”,但理想情况下有10,000个数字。 当我们为1000执行此操作时,10,000会抛出错误,说代码对于try语句来说太大了。 为了生成这个,我们使用stringbuilder并循环遍历值的数组。 显然这是javac的一个限制。 我们被告知,如果我们以小块的forms传递它,我们可以在我们调用的方法中重建数组。 然而,这是不可能的,因为我们无法控制我们正在调用的用户方法。 我想发布代码,但不能,因为这是一个大学的项目。 我不是在寻找代码解决方案,只是帮助理解这里的实际问题。 它的for循环是罪犯 Object o = new Object() { public String toString() { StringBuilder s = new StringBuilder(); int length = MainInterfaceProcessor.this.valuesFromData.length; Object[] arrayToProcess = MainInterfaceProcessor.this.valuesFromData; if(length == 0) { //throw exception to do } else if(length == 1) { s.append(“{” + Integer.toString((Integer)arrayToProcess[0])+”}”); } […]

无法访问的代码编译器错误

以下代码给出了unreachable statement编译器错误 public static void main(String[] args) { return; System.out.println(“unreachable”); } 有时为了测试目的,想要阻止一个方法被调用,所以快速的方法(而不是在它使用的任何地方注释它)是立即从方法返回,以便该方法什么都不做。 然后,我总是这样做以解决编译器错误 public static void main(String[] args) { if (true) { return; } System.out.println(“unreachable”); } 我只是好奇,为什么它是一个编译错误? 它会以某种方式打破Java字节码,它是为了保护程序员还是其他东西? 另外(这对我来说更有趣),如果编译java到字节码进行任何类型的优化(或者即使它没有)那么为什么它不会在第二个例子中检测到明显无法访问的代码呢? 编译器伪代码用于检查语句是否无法访问?

在Java中连接字符串是否总是导致在内存中创建新字符串?

我有一个不符合屏幕宽度的长字符串。 例如。 String longString = “This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.”; 为了便于阅读,我想到了这样写 – String longString = “This string is very long.” + “It does not fit the width of the screen.” […]