如何通过Java代码更改包信息?

时间:2012-04-09 15:25:06

标签: java

在我目前的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“时,有没有办法在标题中更改包信息(通过java代码,而不是手动)。 inria.arles.pankesh.impl”。

2 个答案:

答案 0 :(得分:3)

如果您复制java源文件,则需要

  1. 打开源文件。
  2. 打开目标文件。
  3. 将所有内容从源复制到目标,直至看到package关键字。
  4. 将package关键字复制到目标文件中。
  5. 将“corrrect”包位置写入目标文件
  6. 跳过源文件中的“错误”包位置
  7. 将源文件中的其余内容写入目标文件。
  8. 请注意,这将正确“重新绑定”文件的包;但它不会“修改”其他可能希望在“旧”包中找到该文件的文件。要修复那些其他文件(如果它们存在,也许你的项目设计得没有那么多的引用,或者你打算复制所有文件),你需要打开项目中的每个文件,寻找“移动”类。一个import声明。如果找到它,则需要复制导入,但要复制正确的替换。

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

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

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

    java.io和类java.lang.String具有允许您编写这些工具的所有实用程序,但是详细介绍将会发布太长的帖子。尝试写一点,搜索网页(如何用java读取文件中的行,如何用java编写行文件),发布代码,了解你已经获得了多少以及你的具体内容错误或误解,很多人会很乐意提供帮助。

    如果你想对已编译的文件执行此操作,则需要读取一下java类文件格式,并找到类名常量字符串,并通过上面的类似过程进行更改(除了你将写二进制字节),或者你可以使用像ASM这样的库来执行与上面相同的程序(但也许可以省去你手工完成时可能犯的错误。)

答案 1 :(得分:1)

你可以付出很多努力,

  1. 解析Java文件并更新它们(这并不容易,只需考虑评论或字符串中有package字的时间)。
  2. 你应该更新所有引用它们的类(这更难,因为你应该更改import语句,更改完全限定的类名,并将import语句添加到同一个包中的类(因为它们是邻居并且没有import statements)。
  3. 我建议您使用IDE(例如Eclipse,Netbeans或IDEA)并使用其重构功能。