需求:获取当前方法名
为了获取当前方法名已知的有1.堆栈获取2.通过classs 的enclosingMethod.name
比较准确的是enclosingMethod,但是为了获取这个还需要一个内部类,于是用到了Runable,但是run方法没有返回值
于是出现了神奇问题
1.照Runnable 抄一份:源码如下:
@FunctionalInterface public interface Runnable { public abstract void run(); }
2.自定义接口 kotlin 版本会自动给转换成为
fun interface IRunnable { fun run(): String? }
使用方法如下:
`class Internal() {
fun bilibli() {
val runnable = IRunnable {
val methodName = object : Any() {}.javaClass.enclosingMethod.name
Log.d("测试", "bilibli当前方法名:${methodName}")
methodName
}
val name = runnable.run()
Log.d("测试", "bilibli当前方法名:${name}")
}
fun alibaba() {
val runnable = Runnable {
val methodName =
object : Any() {}.javaClass.enclosingMethod.name
Log.d("测试", "alibaba当前方法名:$methodName")
return@Runnable
}
runnable.run()
}
`
问题来了:
回合1:结果
alibaba:打印出来了预期值alibaba
bilibli 打印返回竟然是:run
于是不服更改方式
尝试1:更改接口:
@FunctionalInterface interface IRunnable { fun run(): String? }
回合2:依旧是
alibaba:打印出来了预期值alibaba
bilibli 打印返回竟然依旧是:run
无解,查看字节码反编译文件如下:
` public final class Internal {
public final void bilibli() {
IRunnable runnable = com.example.demo.Internal::bilibli$lambda$1;
String name = runnable.run();
Log.d("测试", "bilibli当前方法名:" + name);
}
public final void alibaba() {
Runnable runnable = com.example.demo.Internal::alibaba$lambda$2;
runnable.run();
}
private static final String bilibli$lambda$1() {
String methodName = (new Object() {
}).getClass().getEnclosingMethod().getName();
Log.d("测试", "bilibli当前方法名:" + methodName);
return methodName;
}
private static final void alibaba$lambda$2() {
String methodName = (new Object() {
}).getClass().getEnclosingMethod().getName();
Log.d("测试", "alibaba当前方法名:" + methodName);
}
'
汇合3:无奈,只能将IRunnable改成java
@FunctionalInterface public interface IRunnable { public abstract String run(); }
结果:
alibaba:打印出来了预期值alibaba
bilibli 打印返回竟然依旧是:bilibli
目前看达到预期:
此处有些疑惑不解,java@FunctionalInterface interface 和kotlin fun interface虽然有所同,但是kotlin用@FunctionalInterface interface也依旧无效,不知原因点在哪,字节码也是相同。肾是困惑