打印多个注解
来源:8-2 Kotlin中使用 Java 反射-2

慕妹2978617
2019-12-04
@Poko
@Poko2
class AnnotationTest2(val name: String = "name2")
main:
Class.forName("com.qinglianyun.kotlin.class8.AnnotationTest2")
.annotations.forEach {
println(it)
}
annotation class Poko
annotation class Poko2
反编译
@Poko
@Metadata(
mv = {1, 1, 13},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0004\b\u0017\u0018\u00002\u00020\u0001B\u000f\u0012\b\b\u0002\u0010\u0002\u001a\u00020\u0003¢\u0006\u0002\u0010\u0004R\u0014\u0010\u0002\u001a\u00020\u0003X\u0096\u0004¢\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006¨\u0006\u0007"},
d2 = {"Lcom/qinglianyun/kotlin/class8/AnnotationTest1;", "", "name", "", "(Ljava/lang/String;)V", "getName", "()Ljava/lang/String;", "app"}
)
public class AnnotationTest1 {
Metadata
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
@SinceKotlin("1.3")
public annotation class Metadata(
控制台输出
@com.qinglianyun.kotlin.class4.annotations.Poko()
@com.qinglianyun.kotlin.class4.annotations.Poko2()
@kotlin.Metadata(xi=0, bv=[1, 0, 3], mv=[1, 1, 13], k=1, xs=, d1=[
20B0¢R0X–¢
¨], d2=[Lcom/qinglianyun/kotlin/class8/AnnotationTest2;, , name, , (Ljava/lang/String;)V, getName, ()Ljava/lang/String;, app_debug], pn=)
Process finished with exit code 0
首先调用getAnnotation方法单个注解是正确的但是当一个class被多个注解修饰时调用.annotations会出现三个注解(本身只有2个)字节码发现默认会生成@Metadata注解。那么我现在有3个问题1。我应该如何打印出多个注解 2.@Metadata注解的类型是RUNTIMEAnnotationTarget.CLASS按之前讲解的无论调用什么方法他都应该打印出来(但是调用getAnnotation没有打印)3.为什么打印参数的时候能正确输出(字节码中参数被@NotNull修饰 为什么没打印出来)
写回答
1回答
-
bennyhuo
2019-12-04
getAnnotation不是要传注解的类型吗?你传入Metadata的class就可以拿到了。这个注解是kotlin用来反射用的。Notnull这个注解只有在字节码才有吧,去看下他的定义就好了(我现在手头看不了,同学自己查看下吧),如果是字节码或者源码级,运行时应该获取不到是正常的,也没多大意义。
022019-12-05
相似问题