针对 Java 注解处理器开发者的参考文档
程序元素
Java | KSP 中的类似功能 | 注意事项 |
---|
AnnotationMirror
| KSAnnotation
| |
AnnotationValue
| KSValueArguments
| |
Element
| KSDeclaration /KSDeclarationContainer
| |
ExecutableElement
| KSFunctionDeclaration
| |
PackageElement
| KSFile
| KSP 不将包建模为程序元素 |
Parameterizable
| KSDeclaration
| |
QualifiedNameable
| KSDeclaration
| |
TypeElement
| KSClassDeclaration
| |
TypeParameterElement
| KSTypeParameter
| |
VariableElement
| KSValueParameter /KSPropertyDeclaration
| |
类型
KSP 要求明确解析类型, 因此在解析之前, Java 中的有些功能只能通过 KSType
和对应的元素得到.
Java | KSP 中的类似功能 | 注意事项 |
---|
ArrayType
| KSBuiltIns.arrayType
| |
DeclaredType
| KSType /KSClassifierReference
| |
ErrorType
| KSType.isError
| |
ExecutableType
| KSType /KSCallableReference
| |
IntersectionType
| KSType /KSTypeParameter
| |
NoType
| KSType.isError
| KSP 中没有这样的功能 |
NullType
| | KSP 中没有这样的功能 |
PrimitiveType
| KSBuiltIns
| 与 Java 中的基本类型不完全相同 |
ReferenceType
| KSTypeReference
| |
TypeMirror
| KSType
| |
TypeVariable
| KSTypeParameter
| |
UnionType
| 没有这样的功能 | Kotlin 的 每个 catch 代码段只有 1 个类型. 即使对 Java 注解处理器来说, UnionType 也是不可访问的 |
WildcardType
| KSType /KSTypeArgument
| |
杂项
Java | KSP 中的类似功能 | 注意事项 |
---|
Name
| KSName
| |
ElementKind
| ClassKind /FunctionKind
| |
Modifier
| Modifier
| |
NestingKind
| ClassKind /FunctionKind
| |
AnnotationValueVisitor
| | |
ElementVisitor
| KSVisitor
| |
AnnotatedConstruct
| KSAnnotated
| |
TypeVisitor
| | |
TypeKind
| KSBuiltIns
| 有些可以在 builtin 中得到, 其他通过 KSClassDeclaration 得到 DeclaredType |
ElementFilter
| Collection.filterIsInstance
| |
ElementKindVisitor
| KSVisitor
| |
ElementScanner
| KSTopDownVisitor
| |
SimpleAnnotationValueVisitor
| | KSP 中不需要 |
SimpleElementVisitor
| KSVisitor
| |
SimpleTypeVisitor
| | |
TypeKindVisitor
| | |
Types
| Resolver /utils
| 有些 utils 也被集成在符号接口中 |
Elements
| Resolver /utils
| |
细节
这部分介绍 KSP 怎样提供 Java 注解处理 API 的功能.
AnnotationMirror
Java | KSP 中的同等功能 |
---|
getAnnotationType
| ksAnnotation.annotationType
|
getElementValues
| ksAnnotation.arguments
|
AnnotationValue
Java | KSP 中的同等功能 |
---|
getValue
| ksValueArgument.value
|
Element
Java | KSP 中的同等功能 |
---|
asType
| ksClassDeclaration.asType(...) 只对 KSClassDeclaration 有效. 需要提供类型参数.
|
getAnnotation
| 未实现 |
getAnnotationMirrors
| ksDeclaration.annotations
|
getEnclosedElements
| ksDeclarationContainer.declarations
|
getEnclosingElements
| ksDeclaration.parentDeclaration
|
getKind
| 通过 ClassKind 或 FunctionKind 进行类型检查和转换 |
getModifiers
| ksDeclaration.modifiers
|
getSimpleName
| ksDeclaration.simpleName
|
ExecutableElement
Java | KSP 中的同等功能 |
---|
getDefaultValue
| 未实现 |
getParameters
| ksFunctionDeclaration.parameters
|
getReceiverType
| ksFunctionDeclaration.parentDeclaration
|
getReturnType
| ksFunctionDeclaration.returnType
|
getSimpleName
| ksFunctionDeclaration.simpleName
|
getThrownTypes
| Kotlin 中不需要 |
getTypeParameters
| ksFunctionDeclaration.typeParameters
|
isDefault
| 检查父类型是不是接口 |
isVarArgs
| ksFunctionDeclaration.parameters.any { it.isVarArg }
|
Parameterizable
Java | KSP 中的同等功能 |
---|
getTypeParameters
| ksFunctionDeclaration.typeParameters
|
QualifiedNameable
Java | KSP 中的同等功能 |
---|
getQualifiedName
| ksDeclaration.qualifiedName
|
TypeElement
Java | KSP 中的同等功能 |
---|
getEnclosedElements
| ksClassDeclaration.declarations
|
getEnclosingElement
| ksClassDeclaration.parentDeclaration
|
getInterfaces
|
// 不需要类型解析也应该能够实现
ksClassDeclaration.superTypes
.map { it.resolve() }
.filter { (it?.declaration as? KSClassDeclaration)?.classKind == ClassKind.INTERFACE } <br>
|
getNestingKind
| Check KSClassDeclaration.parentDeclaration 和 inner 修饰符 |
getQualifiedName
| ksClassDeclaration.qualifiedName
|
getSimpleName
| ksClassDeclaration.simpleName
|
getSuperclass
|
// 不需要类型解析也应该能够实现
ksClassDeclaration.superTypes
.map { it.resolve() }
.filter { (it?.declaration as? KSClassDeclaration)?.classKind == ClassKind.CLASS }
|
getTypeParameters
| ksClassDeclaration.typeParameters
|
TypeParameterElement
Java | KSP 中的同等功能 |
---|
getBounds
| ksTypeParameter.bounds
|
getEnclosingElement
| ksTypeParameter.parentDeclaration
|
getGenericElement
| ksTypeParameter.parentDeclaration
|
VariableElement
Java | KSP 中的同等功能 |
---|
getConstantValue
| 未实现 |
getEnclosingElement
| ksValueParameter.parentDeclaration
|
getSimpleName
| ksValueParameter.simpleName
|
ArrayType
Java | KSP 中的同等功能 |
---|
getComponentType
| ksType.arguments.first()
|
DeclaredType
Java | KSP 中的同等功能 |
---|
asElement
| ksType.declaration
|
getEnclosingType
| ksType.declaration.parentDeclaration
|
getTypeArguments
| ksType.arguments
|
ExecutableType
Java | KSP 中的同等功能 |
---|
getParameterTypes
| ksType.declaration.typeParameters , ksFunctionDeclaration.parameters.map { it.type }
|
getReceiverType
| ksFunctionDeclaration.parentDeclaration.asType(...)
|
getReturnType
| ksType.declaration.typeParameters.last()
|
getThrownTypes
| Kotlin 中不需要 |
getTypeVariables
| ksFunctionDeclaration.typeParameters
|
IntersectionType
Java | KSP 中的同等功能 |
---|
getBounds
| ksTypeParameter.bounds
|
TypeMirror
Java | KSP 中的同等功能 |
---|
getKind
| 对于基本类型, Unit , 与 KSBuiltIns 中的类型比较, 其他情况使用 DeclaredType |
TypeVariable
Java | KSP 中的同等功能 |
---|
asElement
| ksType.declaration
|
getLowerBound
| 未决定. 只存在 capture, 并且需要明确的边界检查时, 才需要这个功能. |
getUpperBound
| ksTypeParameter.bounds
|
WildcardType
Java | KSP 中的同等功能 |
---|
getExtendsBound
|
if (ksTypeArgument.variance == Variance.COVARIANT) ksTypeArgument.type else null
|
getSuperBound
|
if (ksTypeArgument.variance == Variance.CONTRAVARIANT) ksTypeArgument.type else null
|
Elements
Java | KSP 中的同等功能 |
---|
getAllAnnotationMirrors
| KSDeclarations.annotations
|
getAllMembers
| getAllFunctions , getAllProperties 未实现
|
getBinaryName
| 未决定, 参见 Java Specification |
getConstantExpression
| 常数值, 而不是表达式 |
getDocComment
| 未实现 |
getElementValuesWithDefaults
| 未实现 |
getName
| resolver.getKSNameFromString
|
getPackageElement
| 不支持包, 但可以取得包信息. KSP 中不能对包进行操作. |
getPackageOf
| 不支持包 |
getTypeElement
| Resolver.getClassDeclarationByName
|
hides
| 未实现 |
isDeprecated
|
KsDeclaration.annotations.any {
it.annotationType.resolve()!!.declaration.qualifiedName!!.asString() == Deprecated::class.qualifiedName
}
|
overrides
| KSFunctionDeclaration.overrides /KSPropertyDeclaration.overrides (各个类的成员函数)
|
printElements
| KSP 对大多数类有基本的 toString() 实现 |
Types
Java | KSP 中的同等功能 |
---|
asElement
| ksType.declaration
|
asMemberOf
| resolver.asMemberOf
|
boxedClass
| 不需要 |
capture
| 未决定 |
contains
| KSType.isAssignableFrom
|
directSuperTypes
| (ksType.declaration as KSClassDeclaration).superTypes
|
erasure
| ksType.starProjection()
|
getArrayType
| ksBuiltIns.arrayType.replace(...)
|
getDeclaredType
| ksClassDeclaration.asType
|
getNoType
| ksBuiltIns.nothingType /null
|
getNullType
| 根据上下文确定, 可能可以使用 KSType.markNullable |
getPrimitiveType
| 不需要, 检查 KSBuiltins |
getWildcardType
| 在需要 KSTypeArgument 的地方使用 Variance |
isAssignable
| ksType.isAssignableFrom
|
isSameType
| ksType.equals
|
isSubsignature
| functionTypeA == functionTypeB /functionTypeA == functionTypeB.starProjection()
|
isSubtype
| ksType.isAssignableFrom
|
unboxedType
| 不需要 |
最终更新: 2024/12/17