探索Manningham Mills:Java世界中的魔法构建器

探索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时要记住几个黄金法则:

  1. 只改变真正需要改变的内容。
  2. 对于转换为公共的方法要小心,特别是那些原为受保护的方法,因为其他继承该方法的mod如果保留其为受保护状态,可能会导致崩溃。
  3. 确保在开发环境中的转换在生产环境中正确导出。

深入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提供了三种创建枚举扩展的方法,旨在避免不必要的类加载问题,以适应各种情况。

总结:

  1. 项目介绍:Manningham Mills是一款用于Java的访问转换器,使得开发者可以安全地扩展私有和受保护的类及方法,特别是在游戏模组开发场景下。
  2. 项目技术分析:它使用访问转换器在不破坏原有结构的情况下修改类和方法的访问权限,还提供了早起者系统来处理早期注册的扩展。
  3. 应用场景:适用于需要扩展游戏内部类和枚举的模组开发,尤其是需要对私有或受保护成员进行操作的场景。
  4. 项目特点:简化了访问转换器的编写,提高了安全性,提供了早起者系统以应对早期类加载问题,特别适合处理枚举扩展。

无论是新手还是经验丰富的开发者,Manningham Mills都是你探索Java代码深度定制的一个强大工具。现在是时候拥抱这个框架,让代码变得无所不能!

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍辰惟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值