请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

打印多个注解

@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修饰 为什么没打印出来)

正在回答 回答被采纳积分+3

1回答

bennyhuo 2019-12-04 23:51:52

getAnnotation不是要传注解的类型吗?你传入Metadata的class就可以拿到了。这个注解是kotlin用来反射用的。Notnull这个注解只有在字节码才有吧,去看下他的定义就好了(我现在手头看不了,同学自己查看下吧),如果是字节码或者源码级,运行时应该获取不到是正常的,也没多大意义。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕妹2978617 #1
    老师我的问题在于为什么我调用.annotations时会打印出@Metadata注解?如果.annotations不是打印多个注解的方法,那么我该调用哪个方法打印多个注解
    回复 有任何疑惑可以回复我~ 2019-12-05 10:24:49
  • bennyhuo 回复 提问者 慕妹2978617 #2
    打印出来不是应该的吗?本来就有Metadata这个注解,为什么不能打印它?
    回复 有任何疑惑可以回复我~ 2019-12-05 12:09:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信