LaunchWrapper Runtime Fix

基本信息

pl.asie.foamfix.LaunchWrapperRuntimeFix —— 用反射削弱 LaunchWrapper 的两个 内存常驻缓存,使其可被 GC 回收。

两个静态方法

方法 行 反射字段 触发配置项 触发阶段
weakenResourceCache() 43 LaunchClassLoader.resourceCache launchwrapper.weakenResourceCache(默认 true) FMLInitializationEvent
removePackageManifestMap() 57 LaunchClassLoader.packageManifests launchwrapper.removePackageManifestMap(默认 true) FMLPreInitializationEvent

实现要点

LaunchClassLoader loader = (LaunchClassLoader) getClass().getClassLoader();
Field resourceCacheField = ReflectionHelper.findField(LaunchClassLoader.class, "resourceCache");
  • 强转自身 classloader 为 LaunchClassLoader(成立,因为 mod 由 LaunchWrapper 加载);
  • 用 Forge 的 ReflectionHelper.findField 定位私有字段(不走 setAccessible 反射链)。

⚠️ 字段名是版本耦合点

resourceCache 与 packageManifests 是 LaunchWrapper 的私有字段名。 在 LaunchWrapper 版本变动时这些名字可能改变 —— ReflectionHelper.findField 返回 null 会导致 NullPointerException, 没有版本探测或回退分支。

配置注释里的安全性说明

  • weakenResourceCache:Weaken LaunchWrapper's byte[] resource cache to make it cleanuppable by the GC. **Safe.**
  • removePackageManifestMap:Remove LaunchWrapper package manifest map (**which is not used anyway**).

相关条目

源码

  • src/main/java/pl/asie/foamfix/LaunchWrapperRuntimeFix.java