1. 第三方 Capability 注入

考虑一下这么一个情况:

import awesome.power.mod.api.AwesomePowerItemContainer;

public class WeirdItem extends Item {
    public ICapabilityProvider initCapabilities(ItemStack item, NBTTagCompound data) {
        return new AwesomePowerItemContainer(item);
    }
}

那么这里有一个潜在问题,这会让 JVM 尝试加载 AwesomePowerContainer 这个类,然后在没有装对应的 Mod 的情况下你会得到一个 java.lang.ClassNotFoundException。有没有怎么实现这种“可选的依赖”呢?
答案是 @CapabilityInject 注解。

import awesome.power.mod.api.AwesomePowerContainer;
import net.minecraftforge.common.capabilities.CapabilityInject;

public class TeslaCompatibility {
    // 不得不承认,这其实是个黑科技。注解中的类不是真正的 class 对象,泛型参数最终也会被擦除……
    @CapabilityInject(AwesomePowerContainer.class)
    public static void whenAwesomePowerAvailable(Capability<AwesomePowerContainer> cap) {

    }
}