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