假设我想向 Java 添加少量语法糖。只是添加正则表达式模式文字、base-2 文字或多行字符串等小事。语法上没什么大不了的(至少目前如此)。
怎么做呢?
我需要扩展字节码编译器吗?(那可能吗?)
在将源代码提供给标准 Java 编译器之前,我可以编写 Eclipse 插件来进行简单的源代码转换吗?
假设我想向 Java 添加少量语法糖。只是添加正则表达式模式文字、base-2 文字或多行字符串等小事。语法上没什么大不了的(至少目前如此)。
怎么做呢?
我需要扩展字节码编译器吗?(那可能吗?)
在将源代码提供给标准 Java 编译器之前,我可以编写 Eclipse 插件来进行简单的源代码转换吗?
我会看看Project Lombok并尝试重用他们所做的尝试。他们使用 Java 5 注释来挂钩 Java 代理,该代理可以在编译代码之前操纵抽象语法树。他们目前正致力于创建一个 API,以允许编写自定义转换器,该转换器可与 javac 或主要 IDE(如 Eclipse 和 NetBeans)一起使用。除了触发代码生成的注释外,他们还计划添加语法更改(可能是 mixin 或 Java 7 之前的闭包语法)。
(我可能有一些细节略有偏差,但我认为我非常接近)。
Lombok 是开源的,因此研究他们的代码并尝试在此基础上进行构建可能是一个好的开始。
否则,您可以尝试更改 javac 编译器。尽管从我听说的情况来看,对于不是编译器和 Java 专家的任何人来说,这可能是一个令人沮丧的令人毛骨悚然的练习。
javac
您尤其可以使用JSR 269(可插入注释处理)破解。您可以挂钩到遍历源代码中的语句的访问者并对其进行转换。
例如,这是在 java 中添加对罗马数字的支持的转换的核心(当然,请阅读完整的帖子以获取更多详细信息)。这似乎相对容易。
public class Transform extends TreeTranslator {
@Override
public void visitIdent(JCIdent tree) {
String name = tree.getName().toString();
if (isRoman(name)) {
result = make.Literal(numberize(name));
result.pos = tree.pos;
} else {
super.visitIdent(tree);
}
}
}
以下是其他资源:
我不知道 Lombok 项目(在另一个答案中引用)是否使用相同的技术,但我想是的。
JRuby 的技术主管 Charles Nutter 用文字正则表达式扩展了 Javac。据我记得,他不得不改变大约 3 行案例。
JRuby 的技术主管 Charles Nutter 用文字正则表达式扩展了 Javac。据我记得,他不得不改变大约 3 行案例。
见http://twitter.com/headius/status/1319031705
这是一个关于如何向 javac 添加新运算符的很棒的教程,http: //www.ahristov.com/tutorial/java-compiler.html
有关更多类似链接,请参阅我的javac 黑客链接列表。