面试题答案
一键面试1. Kotlin 中自定义注解步骤
- 定义注解:使用
annotation
关键字定义注解。注解可以包含属性,属性需要有默认值(除非注解用在构造函数参数上)。例如:
annotation class MyAnnotation(val value: String = "default value")
- 指定注解目标:可以通过
@Target
元注解指定注解可以应用的目标,如类、函数、属性等。例如:
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
annotation class MyAnnotation(val value: String = "default value")
AnnotationTarget
是一个枚举,包含 CLASS
(类)、FUNCTION
(函数)、PROPERTY
(属性)等多种目标类型。
2. 使用反射获取注解信息
- 获取类上的注解:
class MyClass {
@MyAnnotation("example")
class InnerClass
}
val innerClass = MyClass.InnerClass::class
val annotation = innerClass.annotations.find { it is MyAnnotation } as? MyAnnotation
annotation?.let {
println("Value of MyAnnotation: ${it.value}")
}
- 获取函数上的注解:
class MyFunctionClass {
@MyAnnotation("function example")
fun myFunction() {}
}
val function = MyFunctionClass::myFunction
val functionAnnotation = function.annotations.find { it is MyAnnotation } as? MyAnnotation
functionAnnotation?.let {
println("Value of MyAnnotation on function: ${it.value}")
}
3. 实际开发场景中注解的应用
- 依赖注入:例如在 Dagger2 中,使用
@Inject
注解标记需要依赖注入的构造函数或属性,@Module
和@Provides
注解用于提供依赖对象。 - 权限检查:可以自定义一个
@RequirePermission
注解,标记需要特定权限的方法。在运行时通过反射检查方法上的该注解,判断是否有相应权限,如:
@Target(AnnotationTarget.FUNCTION)
annotation class RequirePermission(val permission: String)
class PermissionChecker {
fun checkPermission(any: Any, method: KFunction<*>) {
val annotation = method.annotations.find { it is RequirePermission } as? RequirePermission
annotation?.let {
// 检查权限逻辑
println("Checking permission: ${it.permission}")
}
}
}
class MyApp {
@RequirePermission("android.permission.CAMERA")
fun useCamera() {}
}
val checker = PermissionChecker()
val method = MyApp::useCamera
checker.checkPermission(MyApp(), method)
- 单元测试:JUnit 中使用
@Test
注解标记测试方法,框架通过反射获取这些标记的方法并执行测试。