探索Manningham Mills:Java世界中的魔法构建器
在Mixins和偶尔的反射奇技淫巧中,我们找到了Fabric——一个优雅而强大工具,允许我们在代码注入与方法重定向时保持清晰的规则并确保运行时检查的安全性。然而,当我们需要更改条件判断或中断循环时,Mixins就显得力不从心了。此时,我们不再享受简单的注解便利,而是面对着克隆半方法或通过@Overwrite
平坦一切的困境。
当我们尝试将私有类注入到方法中时,你会发现这是一场灾难性的遭遇。如果它是接口,反射可以帮助我们以不那么安全的方式扩展(例如,使用InvocationHandler
)。但如果是一个类,麻烦会更大,我们可能只能依赖于祈祷式的@Coerce
。当你想要扩展一个私有类时,Mixins彻底把你抛向了自给自足的世界。
这就是Manningham Mills(MM)发挥作用的地方。它提供了一个战斗舰级别的解决方案,名为访问转换器(Access Transformers, AT),让你能够安全地航行在代码修改的深海之中。
在Shenanigans中航行
定义战舰
MM由Loom在开发期间定义,并自动在生产代码中将AT从Yarn映射到Intermediary名称,并将其移动到jar根目录下的silky.at
。MM将在运行时加载并应用任何转换,如果未找到AT,将会抛出IllegalAccessException
。Loom会在开发过程中应用所有转换,所以只有当添加其他带有AT的mod时才需要MM。
合理构造
在Fabric环境下,AT主要用于使类公开以便直接引用和扩展,以及使方法公开以便扩展。因此,MM提供了一种更简化的方式来处理不需要字段或非公共转换的情况。
安全航行
使用AT时要记住几个黄金法则:
- 只改变真正需要改变的内容。
- 对于转换为公共的方法要小心,特别是那些原为受保护的方法,因为其他继承该方法的mod如果保留其为受保护状态,可能会导致崩溃。
- 确保在开发环境中的转换在生产环境中正确导出。
深入Extender's Cove
等待高潮
注册想要进行的扩展需要在mod加载过程的非常早期阶段进行。由于此时其他mod的初始化可能尚未完成,MM提供了“早起者”系统,这些实现了Runnable
的类会在必要时尽早被调用。
早起者通过fabric.mod.json
中的自定义属性mm:early_risers
来定义,值是一个类名字符串数组。如果配置不当,解析类名时会抛出IllegalStateException
。示例的早起者定义在这里:example resources/fabric.mod.json。
导航入口
扩展所需的早期特性可能会引发类加载问题。为了避免这个问题,MM提供了一种在所有mod jar都在类路径上时加载它们的机制,尽管技术上可以在同一个jar中定义早起者,但实际建议每个jar只包含自己的定义。
扩展枚举的秘密
MM提供了三种创建枚举扩展的方法,旨在避免不必要的类加载问题,以适应各种情况。
总结:
- 项目介绍:Manningham Mills是一款用于Java的访问转换器,使得开发者可以安全地扩展私有和受保护的类及方法,特别是在游戏模组开发场景下。
- 项目技术分析:它使用访问转换器在不破坏原有结构的情况下修改类和方法的访问权限,还提供了早起者系统来处理早期注册的扩展。
- 应用场景:适用于需要扩展游戏内部类和枚举的模组开发,尤其是需要对私有或受保护成员进行操作的场景。
- 项目特点:简化了访问转换器的编写,提高了安全性,提供了早起者系统以应对早期类加载问题,特别适合处理枚举扩展。
无论是新手还是经验丰富的开发者,Manningham Mills都是你探索Java代码深度定制的一个强大工具。现在是时候拥抱这个框架,让代码变得无所不能!