# 自唤醒

在Bukkit中,基本都要在主类的 onEnable执行自己想要注册的内容
但是Taboolib提供了一个注解器,可以在任意地方进行注解,从而简化代码

TabooLib 最常用的功能必须掌握

# 入口 @Awake

在服务器的某个 生命周期 自动执行 object 内的 无参方法

@Awake(LifeCycle.ENABLE)
fun test() {
    info("我运行了")
}

约等于

public class SelfPlugin extends JavaPlugin{
//
    @Override
    public void onEnable(){
        getLogger.info("我运行了");
    }
}

而上面test方法你可以封装在任意object中
可以大大降低每个类对主类的耦合度 要注意的点:

  1. 必须在 object类内 不然会无效/报错
  2. 方法不可以含有参数 (某些工具会在构建时往函数内插入参数需要检查)

# 生命周期

public enum LifeCycle {
    NONE, // 未启动
    CONST, // 插件初始化(静态代码块被执行时)时
    INIT, // 插件主类被实例化时
    LOAD, // 插件加载时
    ENABLE, // 插件启用时
    ACTIVE, // 服务器完全启动(调度器启动)时
    DISABLE; // 插件卸载时
}

# 另一种自唤醒

如果你想让一个类 继承某个接口/增加某个注解 然后初始化的时候自动执行些什么 应该这样写 你不应该自己随便写扫包模块 这是不理智的

如果你有这种需求 我觉得已经有一定的代码阅读能力了 应该可以看懂以下代码

@Awake
object ClassReader : ClassVisitor(0) {
    override fun getLifeCycle(): LifeCycle {
        return LifeCycle.ENABLE
    }

    override fun visitStart(clazz: Class<*>, instance: Supplier<*>?) {
        if (clazz.interfaces.contains(AbstractSkill::class.java)) {
            info("加载技能: ${clazz.simpleName}")
            val newInstance = clazz.newInstance()
            if (newInstance is AbstractSkill) {
                SkillManager.skills[newInstance.id] = newInstance
            }
        }
    }

}

入门

12分钟

入口 @Awake

生命周期

另一种自唤醒