从Java项目中提取所有字符串

时间:2020-03-06 15:00:18  来源:igfitidea点击:

我有大量的源文件,我需要解析并提取所有字符串文字并将它们放在文件中,作为播放旧的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"是否已经自动完成了这种事情。

解决方案

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

这不能完全满足要求(将Constants.java文件中的字符串作为Strings),但是使用的方法确实非常强大。它将它们移动到一个属性文件中,该文件可以根据语言环境动态加载。根据建议,将它们保存在单独的Java源文件中意味着我们将一次在应用程序中使用所有语言,或者根据语言环境交付不同的应用程序。

我们将它用于我们的应用程序中,即使基本的东西也必须以英语和日语发布,而更复杂的应用程序以12种语言发布,无论如何,我们都不是小型软件开发公司:-)。

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

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

有一些很好的原因使我们不想这样做。除了任何这样生成的文件(我不知道eclipse函数)的事实,都无法区分我们所设置的字符串,例如,测试类中的构造函数args和我们实际上想要拥有的东西。常量,更大的问题是所有公共静态最终变量都将被编译到类中,如果我们想更改类的行为,则不仅需要更改包含常量的类,还需要更改所有引用常量的类。

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

应用于类文件时,函数"外部字符串"将创建两个文件,一个类Messages.class和一个属性文件messages.properties。然后,它将所有直接使用的字符串文字重定向到对Messages.get(String key)的调用,并使用我们在" Ext。String"向导中为字符串输入的密钥。

顺便说一句:属性文件有什么坏处?如他所说,我们只需更改属性文件即可,如果需要更改文本,则不必更改类。

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

我们可能想要检查NetBeans中的Hymanpot源转换引擎,该引擎将允许我们编写源转换脚本。

要完成Peter Kelley的答案,我们可以考虑在Eclipse IDE中使用AST解决方案。

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

在此eclipse角落文章中提供了完整的示例,在eclipse帮助中也提供了更多详细信息。
而且,我们可以在Eclipse JDT中自动嵌入特定于域的语言的"就地翻译的实现"部分的清单5中找到一些示例,以及GitHub项目中的多个示例。