@NonNull 和 @Nullable 注释会影响Android在运行时的性能吗?我的意思是他们只有支持LINT和其他工具来检测可能的错误的目的,所以他们可能/希望在编译期间被忽略。你有什么资料来证明这一点吗?
答案 0 :(得分:4)
使用@NonNull
retention policy声明Nullable
和CLASS
注释。它们在编译的字节码中可见,但在运行时可由VM忽略。
如果您对性能感到担忧,请运行一项实验,看看它是否适合您。我假设类保留注释不会增加任何显着的开销。
(如果保留策略是运行时和,则在运行时通过反射查询注释,然后会出现性能问题,尤其是past。)
答案 1 :(得分:2)
作为一个小实验,我在Android应用中创建了以下方法:
private void test(@NonNull Object o) {
o.toString();
}
.method private test(Ljava/lang/Object;)V
.locals 0
.param p1, "o" # Ljava/lang/Object;
.annotation build Landroid/support/annotation/NonNull;
.end annotation
.end param
.prologue
.line 22
invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;
.line 23
return-void
.end method
因此,Nonnull
注释实际上并未在编译时从代码中删除。
我可以关闭Android studio中的检查,以null
为参数调用test-method并编译应用程序。然后它会在NullPointerExeption
o.toString()
崩溃,但是没有提示VM实际上使用注释在运行时检查参数。正是拉尔托在他的回答中所说的。
我确实想知道VM是否能够这样做并且在使用null
参数调用该方法时抛出异常。