注解基础
@Retention(RetentionPllicy.CLASS/RUNTIME/SOURCE)
推荐使用模式为
SOURCE:单纯阅读使用(该注解仅仅是声明,只会在源代码中留存,编译时会被删除,无法在编译期间和运行时通过反射获取)
CLASS:单纯编译时使用(该注解会在.class字节码中,但是不需要由虚拟机在运行时保留)
RUNTIME:运行时需要反射使用(注解会被保留到运行时,可以通过反射获取)
@Target({ElementType.TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,TYPE_PARAMETER,TYPE_USE})
了解常用几个就行:
TYPE:作用在类/接口声明上
ANNOTATION_TYPE:作用在注解声明上,target就是这种类型的注解
FIELD:作用在属性上,比如类中的某个参数
METHOD:作用在类中方法上面
常用注解
@Nullable 作用于函数参数或者返回值,标记参数或者返回值可以为空.
@NonMull 作用于函数参数或者返回值,标记参数或者返回值不可以为空.
@UiThread 标记运行在UI线程 中
@MainThread 标记运行在主线程中
@workThread 标记运行在后台线程中
@binderThread 标记运行在Binder线程中
@keep 标记在PROGUARD 混淆中不需要混淆的类和方法
@SerializedName(name) 标记实体类中对name重命名
@Override 编译器会检查被注解的方法是否真的重载了一个来自父类的方法,如果没有,编译器将会给出错误提示。
@Deprecated 可以用来修饰任何不再鼓励使用或者已被弃用的属性和方法等
@SuppresWarnings 可用于除了包之外的其他声明项中,用来抑制某种类型的警告
@SafeVarargs 用于方法和构造函数,用来断言不定长参数可以安全使用
@Generated 一般是给代码生成工具使用,用来表达这段代码不是开发者手动编写的,而是工具生成的,被@Generated修饰的代码一般不建议手动修改它
@FuncationalInterface 用来修饰接口,表示对应的接口是带单个方法的函数式接口
@IntDef & @StringDef 替代 Java 中枚举的注解,
@FloatRange 和 @IntRange 是用于限定范围的注解。其中 @FloatRange 是限定 float 类型的,而 @IntRange 是限定 int 类型的。它们同上注解一样,可以修饰方法参数、方法返回值、成员属性。
@Size 注解的作用是限定长度的,同上注解一样,可以修饰方法参数、方法返回值、成员属性。
@RequiresPermission 该注解作用是表明方法所执行的内容需要权限。
@CheckResult 注解是作用于方法上的,作用是检验有没有处理返回值。如果没有处理返回值则会报错。
@IntegerRes R.integer 类型资源。
@AnimatorRes R.animator 类型资源。
@AnimRes R.anim 类型资源。
@ArrayRes R.array 类型资源。
@AttrRes R.attr 类型资源。
@BoolRes R.bool 类型资源。
@ColorRes R.color 类型资源。
@DimenRes R.dimen 类型资源。
@DrawableRes R.drawable 类型资源。
@FractionRes R.fraction 类型资源。(百分比)
@IdRes R.id 类型资源。
@InterpolatorRes R.interpolator 类型资源。(插值器)
@LayoutRes R.layout 类型资源。
@MenuRes R.menu 类型资源。
@PluralsRes .plurals 类型资源。(复数)
@RawRes R.raw 类型资源。
@StyleableRes R.styleable 类型资源。
@StyleRes R.style 类型资源。
@TransitionRes R.transition 类型资源。
@XmlRes R.xml 类型资源。
@AnyRes 未知资源。(表示自己不知道是什么类型的资源。比如有可能为 R.drawable 也有可能是 R.string。)
@CallSuper 该注解用于修饰方法,表示重写该方法时必须调用 super 方法。如 onCreate() 方法:
@VisibleForTesting 注解只起到一个注释的作用,告诉其他开发者被标记的代码为什么有这么大的可见程度(为了测试方便)。因此,经常用来修饰 public 或 protected,用来修饰 private 并不会报错,但是没有意义。