@NonNull和@Nullable注释 - 它会影响Android的性能吗?

时间:2015-10-25 08:37:22

标签: android annotations

@NonNull @Nullable 注释会影响Android在运行时的性能吗?我的意思是他们只有支持LINT和其他工具来检测可能的错误的目的,所以他们可能/希望在编译期间被忽略。你有什么资料来证明这一点吗?

2 个答案:

答案 0 :(得分:4)

使用@NonNull retention policy声明NullableCLASS注释。它们在编译的字节码中可见,但在运行时可由VM忽略。

如果您对性能感到担忧,请运行一项实验,看看它是否适合您。我假设类保留注释不会增加任何显着的开销。

(如果保留策略是运行时,则在运行时通过反射查询注释,然后会出现性能问题,尤其是past。)

答案 1 :(得分:2)

作为一个小实验,我在Android应用中创建了以下方法:

private void test(@NonNull Object o) {
    o.toString();
}

编译项目,用ApkTool“解压缩”并查看smali文件:

.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参数调用该方法时抛出异常。