Tag: javac

从lambda表达式引用final字段

最近我发现匿名类和lambda表达式之间存在细微差别: public class FinalTest { final Runnable x = new Runnable() { @Override public void run() { System.out.println(x.hashCode()); } }; final Runnable y = () -> System.out.println(y.hashCode()); } 通常lambdas等同于匿名类。 甚至我的Eclipse IDE都有重构将x转换为lambda(它变得和y完全一样)并将y转换为匿名类(它变得和x完全一样)。 然而lambda给我一个编译错误,而匿名类可以完美编译。 错误消息如下所示: >javac FinalTest.java FinalTest.java:9: error: self-reference in initializer final Runnable y = () -> System.out.println(y.hashCode()); ^ 1 error 所以问题是:为什么会有这样的差异?

ToolProvider.getSystemJavaCompiler()返回null – 仅在安装了JRE时可用?

我正在尝试使用JavaCompiler类: http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html 当我调用ToolProvider.getSystemJavaCompiler()时,它返回null。 我想这是因为我使用的是JRE而不是JDK。 问题是我希望它在所有平台上运行,无论用户使用JRE还是JDK的天气如何。 如果有人知道如何解决这个问题,或者使用其他方法请注释。 任何帮助,将不胜感激。

Java8,如何在visitMethodInvocation中发现类和方法名?

对于Java7和Java8,我想在调用某些方法时生成警告。 如果在用户编译时存在特定的jar,则将打印该警告。 我编写了一个Annotation Processor并捕获了visitMethodInvocation()。 现在,我想要提取类和方法名称将被调用。 有可能吗? 或者如何处理这个?

静态最终字段的非正向引用错误

我正在尝试编译一个javac拒绝的Java类,其中包含非法的前向引用错误,其中违规引用是在引用字段之后的词法上。 在显示相同行为时,尽可能地删除以下类: java.util.concurrent.Callable和Object的许多用法仅用作占位符来删除不相关的代码片段。 public class Test { static final Object foo = method(new java.util.concurrent.Callable() { @Override public Object call() throws Exception { return bar; } }); static final Object bar = foo; static Object method(Object binder) { return null; } } 使用javac Test.java编译时,javac会输出以下错误消息: Test.java:9: illegal forward reference static final Object bar = foo; ^ 所以编译器抱怨bar的声明引用foo而foo应该在bar的声明范围内。 […]

Javagenerics在Eclipse中编译,但不在javac中编译

我必须发现我的项目中有Java代码,它在Eclipse中编译并运行良好,但在javac中抛出了编译错误。 一个独立的片段: import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args) { Set setOfInts = new HashSet(); Set setOfObjects = covariantSet(setOfInts); } public static Set covariantSet(Set set) { return new HashSet(set); } } javac中的编译返回: Main.java:10: incompatible types found : java.util.Set required: java.util.Set Set setOfObjects = covariantSet(setOfInts); ^ 此错误现在阻止在Maven中构建项目。 由于Eclipse编译器构建得更宽容,我现在必须假设片段的定义和用法如上所述静态方法是无效的Java?

Javagenerics代码使用javac编译,Eclipse Helios失败

我有以下测试类,它使用generics来重载方法。 它在使用javac编译时有效,无法在Eclipse Helios中编译。 我的java版本是1.6.0_21。 我读到的所有文章都表明Eclipse是正确的,这段代码不适用。 但是,使用javac和run编译时,会选择正确的方法。 这怎么可能? 谢谢! import java.util.ArrayList; public class Test { public static void main (String [] args) { Test t = new Test(); ArrayList ss = new ArrayList(); ss.add(“hello”); ss.add(“world”); ArrayList is = new ArrayList(); is.add(1); is.add(2); System.out.println(t.getFirst(ss)); System.out.println(t.getFirst(is)); } public String getFirst (ArrayList ss) { return ss.get(0); } public Integer […]

在java的Annotation Processor中发现methodinvocation的类

我正在为构建系统编写一些工具,以对属于包含某些注释的类的方法强制执行一些严格的调用约定。 我正在使用编译器树API … 我想知道的是,当遍历’tree’时,你怎么能告诉MethodInvocation的类/接口的类型。 我将TreePathScanner子类化为: @Override public Object visitMethodInvocation(MethodInvocationTree node, Trees trees) { } 我希望有一种方法可以告诉您尝试调用该方法的类(或接口)的类型。 我是以错误的方式来做这件事的吗? 谢谢你的任何想法……

如何使用特定的javac可执行文件告诉ant构建?

如何告诉ant从命令行使用特定的javac可执行文件? 我在我们分发的库中安装了gcj,作为gcc的一部分构建,我希望有一个特定的Java软件。 但是,它似乎只是使用system-gcc,而诸如“-Dbuild.compiler”之类的选项似乎要我指定某种Java类而不是文件路径。 我希望在Makefiles中有类似于CC的东西。 我确定这很简单,我只是愚蠢。 为了清楚起见,我想尽可能避免自己编辑构建文件。 是否有一些标准的方法来简单地在命令行上指定编译器到ant? 我不介意构建文件在某种意义上“表现良好”的假设。

Java转换:是编译器错误,还是语言规范错误,还是我错了?

我一直在阅读Java语言规范第3版,并且发现了我认为规范和javac编译器实现之间的差异。 Eclipse编译器中存在相同的差异。 第15.16节讨论了强制转换表达式。 如果参数类型无法通过强制转换转换为强制类型,那么它应该是一个编译时错误(第5.5节): 如果操作数的编译时类型永远不会根据强制转换规则(第5.5节)强制转换为强制转换运算符指定的类型,那么这是一个编译时错误。 否则,在运行时,通过将转换转换为强制转换运算符指定的类型来转换操作数值(如果需要)。 第5.5节讨论了转换。 它给出了允许的转换类型列表。 列表中特别缺少的是“取消装箱转换,然后加宽/缩小原始转换”。 然而 ,javac编译器(以及Eclipse编译器)似乎确实允许确切的转换序列。 例如: long l = (long) Integer.valueOf(45); ……编译得很好。 (有问题的强制转换是强制转换;参数的类型为java.lang.Integer ,因此转换需要取消装箱到int后跟扩展的原始转换)。 同样,根据JLS,不应该从byte为char ,因为(根据5.1.4 )需要扩展原始转换和缩小基元转换 – 但是,编译器也允许这种转换。 任何人都可以开导我吗? 编辑:自从问这个以来,我已经向Oracle提交了一份错误报告 。 他们的反应是,这是“JLS中的一个小故障”。

对慢速编译进行故障排除

我应该怎么做才能调查和解决慢速编译问题 ? 我的项目有大约100个类,编译时间超过45秒,这对我来说似乎很慢。 作为参考,我有另外一个项目有50个类,在3秒内编译。 PS: 我使用maven作为构建工具。 编译需要大约50秒( mvn clean compile ),其中45秒用于运行javac(通过使用-X选项运行确认)。 增加内存量没有帮助( -Xms500m ) 我可以提供有关我的项目的更多信息,但它是相当标准的,所以我不确定哪些信息是相关的。 UPDATE 感谢Tagir的想法,我找到了其中一个罪魁祸首。 该类为编译时间增加了20秒: import org.jooq.DSLContext; import org.jooq.Field; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.round; import static org.jooq.impl.DSL.sum; class Test { static Object fast(DSLContext sql) { Field a = field(“a”).cast(Double.class); return sql.select() .having(round(sum(a).cast(Double.class), 2).ne(0d)); } static Object slow(DSLContext sql) { return sql.select() […]