Tag: javac

什么Java代码会强制javac 1.6使用’swap’和’nop’操作码?

我正在开发一个业余的JVM实现,我正在努力确保我对规范中的所有操作码都有测试覆盖率。 我已经把它归结为最后几个,但是nop和swap一直在逃避我。 例如,这是一个可能使用swap的简单函数: static int do_swap() { int a = 56; int b = 32; return b%a; } 但是javac 1.6生成的字节码避免了交换代替本地存储: static int do_swap(); Code: 0: bipush 56 2: istore_0 3: bipush 32 5: istore_1 6: iload_1 7: iload_0 8: irem 9: ireturn 有任何想法吗?

Java 1.7 varargs函数报告为未经检查的警告

我们使用了一些varargs函数,当我们转向java 1.7时,我们得到了一个奇怪的未经检查的警告。 function在接口ICache中添加 public interface ICache { void add(Object source, O… objects); } 在界面中报告错误。 ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O void add(Object source, O… objects); where O is a type-variable: O extends Object declared in interface ICache 1 warning O扩展了Object,作为其通用缓存类。 我读了xlint警告,我们编译时未选中,但是http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示这个错误应该是[varargs]类型不是未选中的类型。 我错过了什么吗?

为什么javac不优化甚至简单的代码?

给出以下代码: public class MainClass { public static int f(){ int i=0; i++; return i; } } 编译器javac生成以下代码: Compiled from “MainClass.java” public class latte_jvm.MainClass { public static int f(); Code: 0: iconst_0 1: istore_0 2: iinc 0, 1 5: iload_0 6: ireturn } 函数f确实很简单 – 它只返回1.它是如此直接翻译,以至于我很难相信java编译器会进行任何优化。 为什么java编译器创建者决定不在编译阶段进行这样的优化?

javac不承认java 7

我最近在我的windows vista上安装了jdk7。 我在C:\Program Files\Java\jdk1.7.0_02\使用了默认安装,其中javac存储在C:\Program Files\Java\jdk1.7.0_02\bin 。 我使用C:\Program_Files\Java\jdk1.7.0\bin为C:\Program_Files\Java\jdk1.7.0\bin和JAVA_HOME (作为我的用户变量)配置了PATH和CLASSPATH环境变量(包括我的用户和系统变量) :\Program_Files\Java\jdk1.7.0\ (我还尝试过使用C:\Program_Files\Java\jdk1.7.0_02\bin )。 java -version产生所需的输出。 我也可以从C:\Program_Files\Java\jdk1.7.0\bin目录运行javac没有问题。 但是,当我尝试从其他地方运行它时,我得到了无法识别的错误。 哪里可能是问题所在。 我错过了什么吗?

注释仅在源级别为5.0语法错误java时可用

我正在使用@Override注释编译一个普通的java程序(我从一些教程中下载了一个来自Internet的源代码)。 现在javac抱怨说 annotations are only available if source level is 5.0 SO或其他网站上的每个问题都与eclipse有关,但我没有使用eclipse。 我正在从命令行编译代码。 我该如何解决这个问题。 以下是一些可能有用的信息: $java -version java version “1.6.0_13-b03 (some other not so useful info) 编辑: $javac -version Eclipse Java Compiler v_677_R32x, 3.2.1 release,…. 编译命令: javac User.java User.java只是普通的java文件。 除了这个之外没有任何错误。

如何在不破坏Maven发布插件的情况下传递javac多个命令行参数,其中一些包括冒号?

当我忘记在Serializable类中声明serialVersionUID时,我想让我的Maven构建失败。 使用javac ,这很简单: $ javac -Xlint:serial -Werror Source.java 直接将其翻译为Maven不起作用: org.apache.maven.plugins maven-compiler-plugin 2.5.1 -Xlint:serial -Werror 引用了compilerArgument ,因此javac只接收一个参数,包含-Xlint:serial -Werror ,而不是-Xlint:serial和-Werror作为单独的参数。 所以你阅读了文档,并找到compilerArguments : org.apache.maven.plugins maven-compiler-plugin 2.5.1 这看起来很奇怪 – 冒号在Xlint命名空间中创建了serial元素,它没有在任何地方声明 – 但它可以工作……直到你想要发布一个版本: $ mvn release:prepare org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project my-project: Error reading POM: Error on line 58: The prefix “Xlint” for element “Xlint:serial” is […]

Java CRTP和通配符:代码在Eclipse中编译,但不是`javac`

对不起,标题含糊不清。 我有这段代码编译Eclipse Juno(4.2)但不是javac(1.7.0_09): package test; public final class Test { public static class N<T extends N> {} public static class R<T extends N> { public T o; } public <T extends N> void p(final T n) {} public void v(final R r) { p(ro); // <– javac fails on this line } } 错误是: Test.java:13:错误:类Test中的方法p不能应用于给定的类型; […]

在gradle中将参数传递给编译器和javadoc

我正在尝试将Gradle作为现有项目的替代构建系统。 该项目利用sun.misc.Unsafe导致类似这样的警告: warning: Unsafe is internal proprietary API and may be removed in a future release import sun.misc.Unsafe; 要禁止此警告, -XDignore.symbol.file作为参数传递给当前ant脚本中的javac和javadoc。 为了在Gradle中抑制这些警告,我不得不求助于我觉得“脏”的黑客,我不太习惯。 apply plugin: ‘java’ compileJava { // I only managed to get this working when I forked // and passed ‘javac’ as an executable options.compilerArgs << '-XDignore.symbol.file' options.fork = true options.forkOptions.executable = 'javac' } javadoc […]

设置Java编译器合规性级别

我需要在命令行上编译Java程序,我试图将编译器级别设置为较低的(1.6)。 我试过这样但是没有用: javac -1.6 Hello.java

java编译器如何查找类文件而classpath未设置为jdk路径?

我试图了解一下java编译的内幕。 所以我放弃了我的IDE并开始使用MS-DOS命令行… 我创建了一个简单的项目,如下面的树所述: SampleApp |____**src** |_____pack |______Sample.java |____**classes** 这是Sample.java源代码: public class Sample { private String s = new String(“Hello, world”); public Sample(){ System.out.println(s); } } 我只想编译这个类,所以我使用了javac命令: prompt\SampleApp\src>javac -d ..\classes -sourcepath . pack\Sample.java 一切正常,但我没想到,因为我在编译Sample.java文件之前删除了我的CLASSPATH环境变量。 所以我期待编译器错误,因为编译器无法找到java.lang.String类文件。 我读了这篇文章http://www.ibm.com/developerworks/java/library/j-classpath-windows/ ,它帮助我理解了很多东西。 文章作者说默认的类路径是当前的工作目录。 但我不明白为什么我的源代码编译没有错误。 有人可以向我解释一下吗?