Files
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

78 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
front:
hard: 入门
time: 12分钟
---
# 自唤醒
在Bukkit中基本都要在主类的 `onEnable`执行自己想要注册的内容
但是Taboolib提供了一个注解器可以在任意地方进行注解从而简化代码
> TabooLib 最常用的功能必须掌握
## 入口 @Awake
在服务器的某个 生命周期 自动执行 object 内的 无参方法
```kotlin
@Awake(LifeCycle.ENABLE)
fun test() {
info("我运行了")
}
```
约等于
```java
public class SelfPlugin extends JavaPlugin{
//
@Override
public void onEnable(){
getLogger.info("我运行了");
}
}
```
而上面test方法你可以封装在任意object中
可以大大降低每个类对主类的耦合度
要注意的点:
1. 必须在 object类内 不然会无效/报错
2. 方法不可以含有参数 (某些工具会在构建时往函数内插入参数需要检查)
## 生命周期
```kotlin
public enum LifeCycle {
NONE, // 未启动
CONST, // 插件初始化(静态代码块被执行时)时
INIT, // 插件主类被实例化时
LOAD, // 插件加载时
ENABLE, // 插件启用时
ACTIVE, // 服务器完全启动(调度器启动)时
DISABLE; // 插件卸载时
}
```
![](../images/0_7.png)
## 另一种自唤醒
如果你想让一个类 继承某个接口/增加某个注解 然后初始化的时候自动执行些什么
应该这样写 你不应该自己随便写扫包模块 这是不理智的
> 如果你有这种需求 我觉得已经有一定的代码阅读能力了 应该可以看懂以下代码
```kotlin
@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
}
}
}
}
```