我希望使我的代码更具可读性,并使用IDE代码检查和/或静态代码分析(FindBugs和Sonar)等工具来避免NullPointerExceptions.许多工具似乎与彼此的@NotNull/ @NonNull/ @Nonnull注释不兼容,并列出我的代码中的所有这些工具都很难阅读.有什么建议是"最好的"吗?这是我发现的等效注释列表:
javax.validation.constraints.NotNull
创建用于运行时验证,而不是静态分析.
文件
edu.umd.cs.findbugs.annotations.NonNull
由Findbugs静态分析使用,因此Sonar(现为Sonarqube)
文档
javax.annotation.Nonnull
这可能也适用于Findbugs,但JSR-305处于非活动状态.(另请参阅:JSR 305的状态是什么?)
来源
org.jetbrains.annotations.NotNull
由IntelliJ IDEA IDE用于静态分析.
文件
lombok.NonNull
用于控制Project Lombok中的代码生成.
占位符注释,因为没有标准.
来源,
文档
android.support.annotation.NonNull
Android中提供的标记注释,由support-annotations包
文档提供
org.eclipse.jdt.annotation.NonNull
Eclipse用于静态代码分析
文档
Java中注释的目的是什么?我把这些模糊的想法放在评论和实际代码之间.它们是否在运行时影响程序?
它们的典型用法是什么?
它们是Java独有的吗?是否有C++等价物?
RetentionPolicy.CLASS和之间有什么实际区别RetentionPolicy.RUNTIME?
看起来两者都记录在字节码中,无论如何都可以在运行时访问它们.
根据Java Annotation API:
RetentionPolicy.CLASS注释将由编译器记录在类文件中,但在运行时不需要由VM保留.
RetentionPolicy.RUNTIME注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射性地读取它们.
我正在寻找"CLASS"保留政策的样本.当我们需要使用此策略而不是RUNTIME策略时.
我很清楚它的含义RetentionPolicy并且知道它们的作用以及何时使用它们似乎是有意义的.对于我自己的注释,我确切地知道它们是在运行时,类文件中还是仅仅用于编译时需要的.但是,使用库中定义的任何注释,您可以恕我直言.
例如,javax.annotation.Generated意味着标记生成的代码,但它很少有用.由于有更多的AFAIK工具对字节码比与源工作工具工作,这些信息就会消失,可以使用之前它.
由于在运行时缺少注释不会抛出 ClassNotFoundException(不像例如,缺少接口),使用RetentionPolicy.RUNTIME似乎不会造成伤害.还是我错了?
或者节省了几个字节使用不同Retentions 的原因?对我来说,这似乎导致太多问题值得.我错过了什么?
RetentionPolicy.CLASS和RetentionPolicy.SOURCE的预期需求是什么.在哪个注释场景中,我们可以使用这些?我想要一些例子.
来自Java doc:
CLASS:注释将由编译器记录在类文件中,但在运行时不需要由VM保留.
SOURCE:编译器将丢弃注释.
不知道我在这里做错了什么.我的目标是获取方法的注释(如果存在).
public class RunTest
{
public static void main(String[] args) throws Exception, NoSuchMethodException
{
MyAction action = new MyAction();
Method method = action.getClass().getDeclaredMethod("printSomething");
RequiredPermission permission = method.getAnnotation(RequiredPermission.class);
String value = permission.permissionName();
System.out.println("permission name: "+value);
}
}
Run Code Online (Sandbox Code Playgroud)
MyAction类
public class MyAction
{
@RequiredPermission(permissionName="SYSO", permissionValue = 0)
public void printSomething()
{
System.out.println("hi there");
}
public void printABC()
{
System.out.println("ABC...");
}
}
Run Code Online (Sandbox Code Playgroud)
和注释:
public @interface RequiredPermission
{
String permissionName();
int permissionValue();
}
Run Code Online (Sandbox Code Playgroud)
我希望在控制台上看到:
权限名称:SYSO
但相反,我得到:
com.annotation.RunTest.main(RunTest.java:14)中线程"main"java.lang.NullPointerException中的异常
我有一个 java.lang.reflect.Method 方法,我想检查它是否用 @Override 注释标记。
尝试使用 method.isAnnotationPresent(Override.class) 执行此操作,但此方法不适用于此注释。还尝试了 MergedAnnotations.from(method).isPresent() 但它也不会为我的带有 @Override 的方法返回 true 。
可以检查一下吗?