问题标签 [ecj]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
206 浏览

java - 是否可以从 Xtend 字符串动态生成 Java 代码字符串?

在 Java 中,可以在运行时从包含在字符串中的源代码编译和加载类(例如使用javax.tools.JavaCompilerEclipseCompilerJanino)。这个过程可以完全在内存中,无需写入任何临时文件。

Xtend语言通过将Xtend 源代码转换为 Java 源代码然后对其进行编译来工作。(如果我错了,请纠正我。)是否可以将包含 Xtend 源代码的字符串转换为包含 Java 源代码的字符串,以便我可以使用我最喜欢的动态编译器?我想在运行时将 Xtend 源代码转换为可加载的类*。如果可能,您需要调用哪些函数/类来执行此操作?

*运行时 = 无 Eclipse-IDE,无 JDK(仅限 JRE),仅使用Xtend 依赖项。

0 投票
1 回答
842 浏览

java - Java 8:泛型类型推断在方法引用上失败?

谁能告诉我为什么以下代码无法编译但 lambda 版本可以:

有关于泛型类型推断的规则吗?我应该避免什么?

失败的:

成功(使用正常的 lambda):

成功(指定通用参数):

参考方法:

0 投票
0 回答
129 浏览

java - Eclipse 默认 JRE、项目合规性和使用的编译器之间的关系

有一段时间我不明白为什么我的 Maven 项目没有在 Eclipse 中构建,并出现“ .class 文件中的错误版本号”错误。

  • 我检查了所有依赖项并确保它们是为 Java 6 或更低版本构建的(使用这个方便的 JAR 版本检查工具)。
  • 我打开我的项目属性并确认我有项目特定的编译器设置,设置为合规级别 1.6。
  • 我还确认我的构建路径上有 Java 6 库。

最后,我发现原因与为我的工作区选择的默认 JRE 有关。由于某种原因,它被设置为 jdk1.5。将其设置为高于此的值(我选择了 jdk1.8)解决了这个问题。最后,我必须选择 jdk1.7 才能让我的 AspectJ 编织正常工作。

我的问题是:为什么这解决了它?根据首选项页面,此设置仅影响将哪个 JRE 添加到新创建的 Java 项目的构建路径中。我无法理解为什么这会影响我构建项目的能力。有什么建议么?似乎 Eclipse 使用默认的 JRE 选择来影响使用的编译器类型。

我正在使用 m2e 来绑定 Eclipse 和 Maven。我的 POM 构建部分如下:

0 投票
1 回答
1410 浏览

generics - Java 8 和 Stream:使用 Eclipse 编译器 (ECJ) 无法正确猜测类型

我有这个代码:

我知道在方法类型参数的情况下,Javac 或 ECJ(在这种情况下)在猜测类型时可能会出错,在这种情况下,我们不得不告诉编译器哪种类型:

为什么在这种特殊情况下,ECJ 无法正确猜测类型,而这似乎是一个简单的案例?

编辑:在 javac(使用 maven)上测试后更新了我的答案并看到它有效。

编辑(2):将代码重构为此工作:

注意: Pair取自 commons-lang,并实现Map.Entry.

0 投票
2 回答
809 浏览

java - Java8 中的模棱两可的重载 - ECJ 或 javac 对吗?

我有以下课程:

这在 JDK 7 的 javac 和 eclipse 下编译得很好(合规性设置为 1.7 或 1.8)。但是,尝试在 JDK 8 的 javac 下编译时,出现以下错误:

请注意,此错误仅适用于方法中的构造函数调用ambigous(),而不适用于方法中的构造函数调用notAmbiguous()。唯一的区别是ambiguous()依赖于钻石算子。

我的问题是:JDK 8 下的 javac 是否正确标记了一个模棱两可的分辨率,或者 JDK 7 下的 javac 未能捕捉到模棱两可?根据答案,我需要提交 JDK 错误或 ecj 错误。

0 投票
4 回答
250 浏览

java - 为什么 Eclipse 让我将一些 Java 7 语言特性编译成 Java 6 类文件?

我发现在 Eclipse 中(使用 Eclipse 编译器)我可以使用一些 Java 7 语言功能,但仍然可以创建 Java 6 类文件。在下图中,您可以看到成功编译为 Java 6 类文件的两个 Java 7 语言特性。但是,注释掉的其他 Java 7 特性不能编译。

我的假设是 Eclipse 正在确定哪些 Java 7 语言特性与 Java 6 JVM 兼容,哪些不兼容。例如,泛型类型 JComboBox 只是一个编译(而不是运行时)特性,所以我可以想象它会如何兼容。虽然我认为 switch String 功能可能会在字节码中产生差异并依赖于新的 JVM 功能,但我可能是错的......

我的问题:

  • Eclipse 真的足够聪明,可以知道哪些 Java 7 语言特性能够编译成 Java 6 类文件,哪些不能?

  • 下面的例子显然不兼容 1.6 源,那么为什么将“源兼容性”设置为 1.6 不会导致错误呢?

  • 这个“技巧”似乎让我至少可以使用一些 Java 7 语言功能,并且仍然可以创建 Java 6 类文件。将 javac 与源 1.7 和目标 1.6 一起使用会失败,那么为什么会这样呢?Ecilpse 编译器是否具有 javac 所没有的功能?

在此处输入图像描述

为了比较,这里是我切换到 Java 6 编译器时的结果,正如预期的那样。

在此处输入图像描述

0 投票
1 回答
52 浏览

eclipse - Annotation information missed after compiled with ECJ Compiler

I found the bytecode compiled from ECJ compiler has the annotation information missing.

The source code decompiled from bytecode compiled by javac:

The source code decompiled from bytecode compiled by ECJ:

So clearly the annotation @GetAction("/hello") is missing from the bytecode compiled by ECJ (in memory compilation).

Anyone has encountered this issue before and get any clue?

Update with more information

Take a look at the following screenshot: enter image description here

So it is in the ASTNode.resolveAnnotations() methods line #797:

A) The state if ((method.tagBits & TagBits.AnnotationResolved) != 0) return annotations; will return null as annotations even

B) the source annotation @GetAction("/hello") is presented because

C) the this.annotations field is null and

D) the if condition (method.tagBits & TagBits.AnnotationResolved) != 0 evaluates to true

Updates 2

It looks like I captured the screen too early, so once process finished, I found the annotations information get stored:

enter image description here

However I still can't get the annotation information from the result file. Click here to download the bytecode file generated:

enter image description here

Note I am using ECJ 4.4.1:

0 投票
2 回答
271 浏览

genetic-programming - Island Model in ECJ

In Genetic Programming (GP), when island model is used, does it mean that it will split the population size between islands?

For example, if in parameters file we have

and we have 4 islands, does it mean that each island will have a population of size 1000? What if we put this line of code in parameters file of each island? Is it possible to have different population size for each island?

I'm using Java and ECJ package to implement island models in GP.

0 投票
1 回答
810 浏览

java - 用 javap 反汇编的枚举不显示构造函数参数

当我用 javap 反汇编一个枚举时,枚举的隐式构造函数参数似乎丢失了,我不知道为什么。

这是一个枚举:

我使用以下命令编译和反汇编它(在 Java 8u60 上):

这是我得到的输出:

我的困惑在于用于实例化每个枚举常量的私有构造函数。反汇编表明它不带参数 ( private Foo();),但它确实带参数。例如,您可以看到load读取传递的枚举常量名称和序号以及this指针的指令,并将它们传递给需要它们的超类构造函数。静态初始化块中的代码还显示它在调用构造函数之前将这些参数压入堆栈。

现在我会假设这只是 javap 中的一个不起眼的错误,但是当我使用 Eclipse 的编译器编译完全相同的枚举并使用 javap 反汇编它时,构造函数完全相同,只是显示了参数

我的问题是: javac 编译的枚举和 Eclipse 编译的枚举在物理上有何不同,导致 javap 不显示 javac 编译的枚举的构造函数参数?这种差异是否是一个错误(在 javap、javac 或 Eclipse 中)?

0 投票
1 回答
594 浏览

java - 在 liferay 6.1 sdk 中使用 ant 构建时出现内部编译器错误

当我尝试在 6.1.10 中编译 portlet 插件时,我遇到了一个奇怪的问题。

插件的第一个版本没有任何问题,并在SVN中提交。我做了这个插件的一个分支,并在 java 文件中做了一些更改,从那以后我无法从提示符编译它(在 Liferay Studio 2.2.x 中它编译正确)。

所以,现在我在同一个SDK中有同一个插件的两个版本,但是第一个版本编译没有问题,第二个版本出现以下错误:

我检查了两个构建的类路径,它们与插件文件夹的名称相同。由于它们构建在相同的 SDK 中,它们使用相同的 java、相同的编译器、门户等。java 版本是 1.6.0_65,但问题也可以在不同的机器上重现。

此外,编译失败的类在两个项目中是相同的。

提前致谢。