12

我有相当多的源文件,我需要解析并提取所有字符串文字并将它们作为播放旧 java 常量放在一个文件中。
举个例子:

Label l = new Label("Cat");

会成为:

Label l = new Label(Constants.CAT);

Constants.java我会有:

public final static String CAT = "Cat";

我不希望将字符串外部化到属性文本文件中。
原因之一是一致性和代码可读性。
另一个是我们的客户端代码使用了GWT,不支持Java属性文本文件机制。

我可以编写某种解析器(也许使用 ant replace 任务)?
但我想知道是否IDE已经自动执行此类操作。

4

5 回答 5

21

Eclipse 会自动执行此操作。右键单击文件,选择“源”,然后选择“外部化字符串”

这并不完全符合您的要求(将 Constants.java 文件中的字符串作为字符串),但使用的方法确实非常强大。它将它们移动到一个属性文件中,该文件可以根据您的语言环境动态加载。按照您的建议将它们放在单独的 Java 源文件中意味着您将在应用程序中同时拥有所有语言,或者您将根据区域设置发布不同的应用程序。

我们将它用于我们的应用程序,即使是基本的东西也必须以英语和日语发布——我们更复杂的应用程序支持 12 种语言——我们绝不是一家小型软件开发公司 :-)。

如果您确实希望它们在 Java 文件中,尽管已经提到了缺点,但编写一个程序将属性文件变形为 Java 源文件比尝试从自由格式的 Java 源中提取字符串要容易得多。

然后,您需要做的就是修改 Accessor 类以使用内置字符串(在单独的类中),而不是在运行时加载它们。

于 2008-10-02T00:42:05.757 回答
9

要完成 Peter Kelley 的回答,您可以考虑 eclipse IDE 的AST解决方案。

然后,您可能会编写一个 AST 程序来解析您的源代码并执行您想要的操作。

Eclipse 角文章中提供了完整示例,更多详细信息请参见Eclipse 帮助您可以在 Eclipse JDT 中自动嵌入领域特定语言的“就地翻译的实现”部分
的清单 5 中找到一些示例,以及GitHub 项目中的多个示例

于 2008-10-02T06:50:55.153 回答
1

有一些很好的理由说明您不想这样做。除了任何此类生成的文件(我不知道 eclipse 函数)不会区分您正在设置的字符串之外,例如,作为测试类中的构造函数参数和您实际想要的东西常量,更大的问题是你所有的公共静态决赛都将被编译到你的类中,如果你想改变类的行为,你不仅需要改变持有常量的类,还需要改变所有引用它的东西。

于 2008-10-02T02:27:13.150 回答
1

我完全承认 Pax Diablo 所说的话。我们也在使用该功能。

当应用于类文件时,“Externalize strings”函数将创建两个文件,一个类 Messages.class 和一个属性文件 messages.properties。然后它会将字符串文字的所有直接用法重定向到对 Messages.get(String key) 的调用,并使用您在“Ext. String”向导中为字符串输入的键。

顺便说一句:属性文件有什么不好?正如他所说,如果您需要更改文本,您可以只更改属性文件而不必更改类。

另一个优点是:将字符串文字提取到属性文件中的方式使您可以自由地将源语言翻译成您想要的任何语言,而无需修改任何代码。属性文件加载器通过使用具有语言 iso 代码的相应文件自动加载目标语言文件。因此,您不必担心代码运行的平台,它会(几乎)自动选择适当的语言。有关详细信息,请参阅类ResourceBundle的文档。

于 2008-10-02T05:13:01.223 回答
0

您可能想查看 NetBeans 中的Jackpot 源转换引擎,它允许您编写源转换脚本。

于 2008-10-02T05:28:03.573 回答