Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重命名预编译类文件(Java)上的导入_Java_Class_Minecraft_Bytecode Manipulation_Import - Fatal编程技术网

重命名预编译类文件(Java)上的导入

重命名预编译类文件(Java)上的导入,java,class,minecraft,bytecode-manipulation,import,Java,Class,Minecraft,Bytecode Manipulation,Import,什么问题? 我是一名Minecraft服务器管理员/服务器主机/插件开发人员,但我发现在每一个新版本的核心游戏中都必须更新自己的个人插件,这绝对是一件麻烦事。它并不总是这样的,我有插件在20个版本中工作,而在过去没有中断。你可以想象,在我的生活中,每个月都要坐在一旁更新40个插件是一件不必要的烦恼,因为我以前从来没有这样做过 问题的原因是什么? 在每个新版本中,它们都要求您在编译的jar文件中使用不同的导入,从而强制破坏任何过时(但可能仍在工作)的jar文件。相信我。我可以阅读一个错误日志,知道

什么问题? 我是一名Minecraft服务器管理员/服务器主机/插件开发人员,但我发现在每一个新版本的核心游戏中都必须更新自己的个人插件,这绝对是一件麻烦事。它并不总是这样的,我有插件在20个版本中工作,而在过去没有中断。你可以想象,在我的生活中,每个月都要坐在一旁更新40个插件是一件不必要的烦恼,因为我以前从来没有这样做过

问题的原因是什么? 在每个新版本中,它们都要求您在编译的jar文件中使用不同的导入,从而强制破坏任何过时(但可能仍在工作)的jar文件。相信我。我可以阅读一个错误日志,知道什么时候我真的需要出去下载一个新的更新。我现在不需要保护自己。这只是一个游戏,我没有太多的把握

那我想怎么办呢? 为此,我想做一个简单的程序,自动更新我的所有插件。(插件以打包的.jar文件的形式出现。)它需要执行以下操作:

  • 获取X_文件夹中所有jar文件的列表
  • 对于每个jar文件,封装所有类
  • 对于每个类文件,搜索Y_字符串的任何实例,并将其替换为Z_字符串
  • 确保所有内容都正确地放回jar文件中
  • 完成了
  • 问题? 如何编写类文件编辑方法?我甚至不知道如何开始

    免责声明 很抱歉听起来我还没开始做这个。我只是,没有任何字节码操作的经验。我看过一些例子,但还没有看到任何关于重命名导入的内容。希望这里有人能帮我。谢谢大家!

    我可以反编译他们的插件,将它们加载到IDE中并手动更新它们,但我更希望有一个更全局的解决方案,你知道吗?此外,这是学习Java新技能的好机会

    我认为你应该学习的技能有:

    • 构建工具(例如Ant或Maven),允许您从源代码重新构建,并将代码加载到IDE中,以及

    • 如何使用流编辑器(如sed或awk)更新源代码,或使用宏预处理器(如cpp或m4)生成源代码

    然而,鉴于Minecraft平台的性质,我不推荐它作为学习Java/Java技能的好地方。当然,黑客/调整/篡改字节码文件是大多数专业Java开发人员通常不需要或使用的技能

  • 获取X_文件夹中所有jar文件的列表
  • 对于每个jar文件,封装所有类
  • 对于每个类文件,搜索Y_字符串的任何实例,并将其替换为Z_字符串
  • 确保所有内容都正确地放回jar文件中
  • 完成了
  • 1) 这是基本的文件操作。查看或其重载

    2) JAR文件是具有特定内容的ZIP文件。调查或研究;迭代其条目()并解压缩()中的每个类文件

    3) 类文件是一种二进制格式,但它的文档记录得非常好。总体布局记录在维基百科上:

    特别有趣的是常量池,它从类文件的字节10开始,枚举类文件中引用的所有常量。同样,维基百科上也记录了这一点:。它的条目数存储在字节8和字节9(big-endian)中

    常量池中特别感兴趣的是字符串和类引用

    字符串由第一个字节
    1
    标识。接下来的两个字节是字符串的字节长度,其余的字节是UTF-8(几乎)。与UTF-8不同,更高的平面存储为代理项对(6字节而不是4字节),代码点0存储为非规范化

    类引用只是指向常量池的指针,指向类的完全限定名。完全限定名以正斜杠而不是点存储,以分隔完全限定名(
    java/lang/Object
    )。它被标记为7型

    常量池中的其他条目:类型3、4、9-12为四字节,类型7和8为两字节。类型5和6是8字节的,但它们也占用常量池中的两个插槽

    类文件的其余部分似乎并不介意常量池的字节长度是否更改。在常量池的末尾添加条目似乎也是安全的(请确保更新常量池长度)


    4) 因为jar文件只是一个zip文件,所以您只需要用更新的内容重新打包原始文件。我不认为这是可能的,所以你可能需要一些文件洗牌。查看实现。

    不确定,但您可以使用BCEL或ASM来完成此任务……您是否考虑过使用Maven来自动化构建过程?我建议编辑源代码并重新编译,而不是编辑编译后的类文件。@JanDvorak我可以用我自己的个人插件来实现这一点,但是一些是由老开发者制作的,他们已经停止了游戏的升级。我可以反编译他们的插件,将它们加载到IDE中并手动更新它们,但我更希望有一个更全局的解决方案,你知道吗?此外,这是一个学习Java新技能的好机会。@Pangamma那么,你没有想要升级的所有插件的源代码吗?编辑
    class
    文件可能是一种冒险。它们有很好的文档记录,但是二进制是二进制的。好的,我现在在第3步。这是到目前为止我的代码。我是否需要使用您发布的指南直接编辑二进制文件,还是应该将其转换为不太混乱的字符串,进行更改,然后将其转换回混乱的格式?(混沌意味着到处都是疯狂字符的二进制形式。)在我的测试输出中,我