- 作者:小万
- 发表时间:2021-03-25 22:29
- 来源:未知
这个代码居然编译过了(提醒一下读者:不是所有注解都可以这么用的,如果你在使用自己写的注解尝试这个例子,请给你使用的注解加上。)。 我很是震精,于是我开始试图了解它背后的含义。这个时候最方便的测试方法当然就是看
别急,在不知道这个东西的语义的时候先不要急着批判 Kotlin。我们编译一下这个代码里的两个函数,看看字节码吧:
然后使用这个命令看看字节码(javap的-v参数表示输出额外信息,这里不需要-c(显示方法体)和-p(显示private的东西)):
看到javap输出了以下结果(已经省略了 80% 对本文无意义的内容了):
然后在两个测试函数中,可以看到#16注解在不同的地方生效了。 首先是String @Nullable [] args的第一个函数:
呃。。。好吧,首先很明显第二个@Nullable同时生效于类型和参数本身了,而第一个只在类型上生效了。 不过我还是不知道他们各自在类型上生效时的字节码的意思(看不懂字节码真是对不起呢),于是就使用控制变量法,再写两个函数对比一下(之所以使用两个不同的List实现,是因为List和数组不一样,擦除了就一样了所以 JVM 签名就冲突叻):
再看看对于泛型类型,Kotlin 的处理方法吧。首先就是刚才那个 Java 代码,Kotlin 表示:
org.aspectj.weaver.patterns.HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor
但是我觉得java要写出php或者python的有些语法糖是不可能的,java的重点也不在这里。
大多数情况下,好的代码应该是易读好维护的,写代码的瓶颈根本不在多写几个字符,多敲几行代码~
某公司有一个安卓开发工程师郑某,跟我联调一个接口,这个接口要MD5签名,反正死活就对不了。然后他就来找我,说肯定是你的接口有问题。我进行了充分检查并试着调用了几次这个接口,都没有任何问题。然后就下班了。
第二天上班,我在日志里记下他的请求,发现MD5签名里缺个0,我就让他们改了。