我希望使我的代码更具可读性,并使用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.lang.annotation.RetentionPolicy常数SOURCE,CLASS和RUNTIME?
我也不完全确定"保留注释"这个短语是什么意思.
Java中注释的目的是什么?我把这些模糊的想法放在评论和实际代码之间.它们是否在运行时影响程序?
它们的典型用法是什么?
它们是Java独有的吗?是否有C++等价物?
根据Java Annotation API:
RetentionPolicy.CLASS注释将由编译器记录在类文件中,但在运行时不需要由VM保留.
RetentionPolicy.RUNTIME注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射性地读取它们.
我正在寻找"CLASS"保留政策的样本.当我们需要使用此策略而不是RUNTIME策略时.
如何@Override使用javaassist创建类时向方法添加注释?
ClassPool pool = ClassPool.getDefault();
CtClass ctClasz = pool.makeClass("test.ExampleImpl");
ctClasz.addInterface(pool.get(MyInterface.class.getName()));
CtMethod method = CtNewMethod.make ("@Override public void print() { System.out.println(\"Hello! \"); }", ctClasz);
ctClasz.addMethod(method);
System.out.println("Implementd: Interfaces:" + ctClasz.getInterfaces());
System.out.println("Methods: " + ctClasz.getMethods());
ctClasz.writeFile("D:");
Run Code Online (Sandbox Code Playgroud)
此代码抛出异常如下:
Exception in thread "main" javassist.CannotCompileException: [source error] syntax error
near "@Override p"
at javassist.CtNewMethod.make(CtNewMethod.java:78)
at javassist.CtNewMethod.make(CtNewMethod.java:44)
at javaassist.Demo.main(Demo.java:17)
Caused by: compile error: syntax error near "@Override p"
at javassist.compiler.Parser.parseClassType(Parser.java:983)
at javassist.compiler.Parser.parseFormalType(Parser.java:191)
at javassist.compiler.Parser.parseMember1(Parser.java:51)
at javassist.compiler.Javac.compile(Javac.java:89)
at javassist.CtNewMethod.make(CtNewMethod.java:73)
... 2 more
Run Code Online (Sandbox Code Playgroud) 我的注释类
@Target({java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.CLASS)
public @interface Base {
int[] value();
}
Run Code Online (Sandbox Code Playgroud)
实际课程
public class Demo {
@Base(1)
public int var;
public int var2;
public void call() {
InjectingClass.inject(this);
System.out.print(var + "");
}
}
Run Code Online (Sandbox Code Playgroud)
如何设置值one来var,而不是在var2?