0

在我当前的 Java 项目中,我编写了一个 Java 程序,它将一些 Java 文件从包“fr.inria.arles.pankesh.gen”复制到包“fr.inria.arles.pankesh.impl”。

将 Java 文件从包“fr.inria.arles.pankesh.gen”复制到包“fr.inria.arles.pankesh.impl”后,由于 Java 文件的包信息更改,我的 java 文件出现错误。

我的问题是“当我的程序将 Java 文件从包“fr.inria.arles.pankesh.gen”复制到包“fr.inria.arles”时,是否有任何方法可以更改标头中的包信息(通过 java 代码,而不是手动) .pankesh.impl”。

4

2 回答 2

3

如果你复制java源文件,你需要

  1. 打开源文件。
  2. 打开目标文件。
  3. 将所有内容从源复制到目标,直到看到package关键字。
  4. 将 package 关键字复制到目标文件中。
  5. 将“正确”的包位置写入目标文件
  6. 跳过源文件中“不正确”的包位置
  7. 将源文件的其余内容写入目标文件。

请注意,这将正确地“变基”文件的包;但它不会对可能希望在“旧”包中找到该文件的其他文件“重新定位”。要修复这些其他文件(如果它们存在,也许您的项目被设计为没有太多引用,或者您打算复制所有文件),您需要打开项目中的每个文件,在一份import声明。如果找到它,则无需复制导入,而是复制正确的替换。

当处理一个不会真正“移动”但需要更改的文件时,最好的策略是编写一个临时文件,然后在临时文件完全写入后用临时文件替换原始文件。像这样:

(reading) MyClass.java
(writing) .tempMyClass.java
(done writing)
(moving)  .tempMyClass.java to MyClass.java

这使您可以不受许多令人讨厌的项目的限制,例如将文件写入需要读取的位置(这将在您读取之前破坏您需要的信息)。

java.io和类java.lang.String具有允许您编写这些工具的所有实用程序,但要详细介绍将是一篇太长的文章。尝试写一点,在网上搜索(如何使用 java 从文件中读取行,如何使用 java 将行写入文件),当你卡住时,发布你已经走了多远和你的具体代码错误或误解,很多人会很乐意提供帮助。

如果您想对已经编译的文件执行此操作,您需要阅读一些 java 类文件格式,找到类名常量字符串,并通过上面类似的过程更改它(除了您将编写二进制字节),或者您可以使用 ASM 之类的库来执行与上述相同的过程(但也许可以避免您在手动操作时可能犯的错误)。

于 2012-04-09T15:42:53.920 回答
1

你可以通过很多努力做到这一点,

  1. 解析您的 Java 文件并更新它们(这并不容易,只需考虑package您的评论或字符串中何时有单词)。
  2. 并且您应该更新所有引用它们的类(这更难,因为您应该更改导入语句,更改完全限定的类名,并将导入语句添加到同一包中的类(因为它们是邻居并且没有导入语句) .

我建议您使用和 IDE(如 Eclipse、Netbeans 或 IDEA)并使用它的重构功能。

于 2012-04-09T16:03:50.197 回答