enum class Command(private vararg val commands: String) {
@FieldEnrich("changeLanguages", "commands")
CHANGE_LANGUAGE;
}
enum class CreatingCarStep(private vararg val values: String) : AbstractStep<CreatingCarStep> {
@FieldEnrich("brand-name", "values")
BRAND_NAME {
override fun next() = MODEL
override fun previous() = BRAND_NAME
};
}
我有两个带有vararg属性和@FieldEnrich注释的枚举.
批注看起来像
@Target(FIELD, CLASS)
@Retention(RUNTIME)
annotation class FieldEnrich(
val property: String,
val field: String
)
注释正在按对象处理
object FieldEnricher {
lateinit var configurationProvider: ConfigurationProvider
fun enrichClass(clazz: Class<*>) {
clazz.enumConstants.forEach {
enrichField(it, clazz)
}
}
private fun enrichField(enum: Any, clazz: Class<*>) {
val enumClass = enum::class.java
if (enumClass.isAnnotationPresent(FieldEnrich::class.java)) {
val fieldEnrich = enumClass.getAnnotation(FieldEnrich::class.java)
val values = configurationProvider.getProperty(fieldEnrich.property, Array<String>::class.java)
val field = clazz.declaredFields.firstOrNull { it.name == fieldEnrich.field }
field?.isAccessible = true
field?.set(enum, values)
}
}
}
逻辑如下.我们用注释@FieldEnrich注释枚举成员,并传递要从中读取值的属性以及设置属性值的字段的名称.
我在调试时发现,当它试图处理CreatingCarStep枚举时是可以的,因为enumConstants方法返回枚举值的实际对象.所以我可以只取这个值的类,得到这个枚举的实际类,然后用我的方法enrichField处理它.但当它试图处理命令enum时,我只得到了enum值.因此,如果我们采用enum value类,那么将返回相同的命令类.在此处输入图像描述.
命令图像->;
创建Carstep图像->;