2008-10-02 60 views
11

所有的字符串我有我需要分析和提取所有的字符串文字并把它们放在一个文件作为播放的旧式Java不变的源文件的一个相当大的数字。
对于为例:提取从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

“我们的客户端代码使用GWT,它不支持Java属性文本文件机制”:这根本不是真的......确实,您不能直接从客户端加载属性文件,而是客户端可以对服务器进行异步调用,并且服务器可以发回属性对象(或者以您需要的任何形式发送数据)。你*可以*在客户端使用属性文件,只需要一两步就可以完成。 – 2013-11-14 13:42:50

回答

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旁找到一些例子。

21

Eclipse会自动执行此操作。右键单击该文件,选择“Source”,然后选择“Externalize strings”

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

我们用它为我们的应用中,甚至连基本的东西,在英语和日语出货 - 我们的更复杂的应用自带了12种语言 - 我们是个不小的软件开发公司以任何方式:-)。

如果希望他们在Java文件中,尽管已经提到的缺点,这是一个更容易编写一个程序变形特性文件转换成Java源文件比它试图提取从字符串自由形式的Java源代码。

所有,那么你需要做的就是修改访问器类使用内置的字符串(在单独的类),而不是在运行时加载它们。

+0

我已经检查过Eclipse,它将移动txt属性文件中的所有字符串,然后由Messages.getString()加载。这不是我想要做的。我只想让我的字符串扮演古老的Java常量。 – 2008-10-02 01:44:32

+0

这不是一个坏主意。一旦你有了这些,你可以寻找这些模式,并用你想要的替换它们。 – ykaganovich 2008-10-02 05:34:45

1

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

1

我完全承认什么大同暗黑说。我们也使用该功能。

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

BTW:属性文件有什么不好?正如他所说的,如果您需要更改文本,则只需更改属性文件并不必更改该类。

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