https://github.com/taboolib/reflex
Reflection API for Kotlin
https://github.com/taboolib/reflex
kotlin kotlin-library reflection reflection-library
Last synced: 4 months ago
JSON representation
Reflection API for Kotlin
- Host: GitHub
- URL: https://github.com/taboolib/reflex
- Owner: TabooLib
- License: cc0-1.0
- Created: 2022-01-21T21:23:50.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2025-11-17T16:08:49.000Z (7 months ago)
- Last Synced: 2025-11-17T17:19:07.426Z (7 months ago)
- Topics: kotlin, kotlin-library, reflection, reflection-library
- Language: Kotlin
- Homepage:
- Size: 212 KB
- Stars: 25
- Watchers: 0
- Forks: 6
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Reflex

```kotlin
repositories {
maven { url = uri("https://repo.tabooproject.org/repository/releases/") }
mavenCentral()
}
dependencies {
// 本体
implementation("org.tabooproject.reflex:analyser:{version}")
implementation("org.tabooproject.reflex:fast-instance-getter:{version}")
implementation("org.tabooproject.reflex:reflex:{version}") // 需要 analyser 模块
// 本体依赖
implementation("org.ow2.asm:asm:9.2")
implementation("org.ow2.asm:asm-util:9.2")
implementation("org.ow2.asm:asm-commons:9.2")
implementation(kotlin("stdlib"))
}
```
## analyser & reflex
Reflex 为基于 Kotlin 语言开发的反射工具,其与 Java 原生反射 API 及 `kotlin-reflect` 间最大区别在于其可**无视软兼容**反射目标类中的字段或方法。
如下方代码所示,此类现象在 Bukkit 插件开发中较为常见:
```java
public class AnyPlugin extends JavaPlugin {
private PlayerPointsAPI api; // PlayerPoints
private AnyField target;
}
```
习惯于将其他插件内的接口缓存于主类的 Bukkit 开发者不在少数,因即便此时 `PlayerPoints` 并未安装,类的运行和插件的启动也不会受到影响。但此做法造成的结果是开发者无法通过反射获取该类中的任何字段:
```java
Field field = Main.class.getDeclaredField("target"); // NoClassDefFoundError: PlayerPointsAPI
```
同类问题也存在于 Bukkit 监听器的注册之上。若插件运行于 1.12 版本以下的环境时,下述 `PlayerJoinEvent` 监听器将无法正常注册。
```java
public class AnyListener extends Listener {
@EventHandler
public void onJoin(PlayerJoinEvent event) {
// 全版本
}
@EventHandler
public void onSwap(PlayerSwapItemEvent event) {
// 1.12 新增
}
}
```
因此, Reflex 脱身于 [TabooLib](https://github.com/taboolib/taboolib) 并发展为独立类库。通过此类库,下述操作将成为可能:
+ 在 [AnalyserTestAsm.kt](https://github.com/TabooLib/Reflex/blob/master/analyser/src/test/kotlin/org/tabooproject/reflex/AnalyserTestAsm.kt) 中获取 `analyser` 的用法。
+ 在 [ReflexTest.kt](https://github.com/TabooLib/Reflex/blob/master/reflex/src/test/kotlin/org/tabooproject/reflex/ReflexTest.kt) 中获取 `reflex` 的用法。
## fast-instance-getter
基于 Java 且不依赖反射的高性能 Kotlin 单例/伴生类实例获取工具,此工具同样解决了上述问题。
```kotlin
val getter = FastInstGetter(ObjectTarget::class.java.name) // 初始化损耗较高,复用时需手动缓存该实例
getter.instance // 获取单例实例
getter.companion // 获取伴生类实例
```