我有相当多的源文件,我需要解析并提取所有字符串文字并将它们放在一个文件中作为播放旧的java常量。
例如:
Label l = new Label("Cat");
会变成:
Label l = new Label(Constants.CAT);
在Constants.java
我会:
public final static String CAT = "Cat";
我不希望字符串在属性文本文件中外部化。
一个原因是一致性和代码可读性
另一个是我们的客户端代码使用GWT
,它不支持Java属性文本文件机制。
我可以编写某种解析器(可能使用ant替换任务)?
但是我想知道IDE
是否已经自动完成了这种事情。
答案 0 :(得分:21)
Eclipse会自动执行此操作。右键单击该文件,选择“Source”,然后选择“Externalize strings”
这并不完全符合您的要求(将Constants.java文件中的字符串作为字符串),但使用的方法确实非常强大。它将它们移动到属性文件中,该文件可以根据您的语言环境动态加载。如您所建议的那样将它们放在单独的Java源文件中意味着您可以立即在应用程序中使用所有语言,或者根据区域设置提供不同的应用程序。
我们将它用于我们的应用程序,即使基本的东西必须用英语和日语发货 - 我们更复杂的应用程序有12种语言 - 我们不是一个小型的软件开发公司: - )。
如果你做想要它们在Java文件中,尽管已经提到了这些缺点,编写一个程序来将属性文件变形为Java源文件比编写它更容易。从自由格式的Java源代码中提取字符串。
您需要做的就是修改Accessor类以使用内置字符串(在单独的类中),而不是在运行时加载它们。
答案 1 :(得分:9)
要完成Peter Kelley的回答,您可以考虑在eclipse IDE中使用 AST 解决方案。
然后你可以编写一个AST程序来解析你的源代码并做你想做的事。
此eclipse corner article中提供了完整示例,eclipse help中还提供了更多详细信息 你可以在Listing 5 of the section "Implementation of in-place translation" of Automating the embedding of Domain Specific Languages in Eclipse JDT和multiple examples in GitHub projects旁边找到一些例子。
答案 2 :(得分:1)
有一些很好的理由可以解释为什么你不想这样做。除了事实上任何这样生成的文件(我不知道eclipse函数)不会区分你正在设置的字符串,例如,作为测试类中的构造函数args和你实际想要的东西常量,更大的问题是所有公共静态韵母都将被编译到您的类中,如果您想要改变类行为,您不仅需要更改包含常量的类,还需要更改引用它的所有内容。
答案 3 :(得分:1)
我完全承认Pax Diablo所说的话。我们也在使用这个功能。
当应用于类文件时,函数“Externalize strings”将创建两个文件,一个是Messages.class类,一个是属性文件messages.properties。然后,它会将字符串文字的所有直接用法重定向到对Messages.get(String键)的调用,并使用您在“Ext.String”向导中为字符串输入的键。
BTW:财产档案有什么不好?正如他所说,你可以只更改属性文件,如果你需要更改文本,则不必更改类。另一个优点是:将字符串文字提取到属性文件中的方式使您可以自由地翻译任何语言的源语言而无需修改任何代码。属性文件加载器通过使用具有语言iso代码的相应文件自动加载目标语言文件。因此,您不必担心代码运行的平台,它将自动选择适当的语言(几乎)。请参阅类ResourceBundle的文档,了解其工作原理。
答案 4 :(得分:0)
您可能需要查看NetBeans中的Jackpot source transformation engine,它允许您编写源转换脚本。