简单学习自定义注解 Annotation
2020-07-09 本文已影响0人
鲨鱼尤德曼
何为注解
Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。
Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注。
Android中常见的注解,如下
- @Nullable - 作用于函数参数或者返回值,标记参数或者返回值可以为空。
- @NonNull - 作用于函数参数或者返回值,标记参数或者返回值不可以为空。
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
-
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
等…………
注解在Android中应用非常广泛,你一定用到过
@Bind(R.id.mip_edit)
EditText mip_edit;
@Bind(R.id.tv_bar_right)
TextView tv_bar_right;
没错,Butterknife就是自定义的注解,我们也可以自定义一个简单的页面跳转注解
步骤
- 创建注解文件
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface GetResId {
@IdRes int value();
}
创建一个Annotation文件,并用@Target注解标志这个自定义注解的使用范围,这里要在变量中使用,所以用ElementType.FIELD; @Retention指示带注解类型的注解要保留多长时间。如果在注解类型声明中没有保留注解,则保留策略默认为RetentionPolicy.CLASS。这里我们只需要在运行时RetentionPolicy.RUNTIME
- 在Activity中设置
@GetResId(R.id.tv_show)
private TextView textView;
@GetResId(R.id.tv_show2)
private TextView textView2;
@GetResId(R.id.btn_goto)
private Button btnGoto;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_annotation);
ctx = this;
InjectUtils.inject(this);
textView.setText("First Page");
textView2.setText("第一页");
btnGoto.setOnClickListener(v -> startActivity(InjectUtils.mIntent));
}
如果第一步没问题,这里获取View则没有问题不会报错,并且btnGoto可以监听点击事件。
就这么容易完结了吗?还没完。InjectUtils.inject(this) 这行代码才是这里的重点。
- 反射获取注解
public static void inject(Activity activity) {
Class<? extends Activity> activityClass = activity.getClass();
Field[] fields = activityClass.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(GetResId.class)) {
GetResId kurode = field.getAnnotation(GetResId.class);
if (kurode == null) {
return;
}
int res = kurode.value();
View tvView = activity.findViewById(res);
field.setAccessible(true);
try {
field.set(activity, tvView);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}}
这里是具体的反射代码,整个自定义注解的精髓所在
通过自定义注解实现点击事件的效果图
![](https://img.haomeiwen.com/i12617529/badae068fe09a1ad.gif)
如有补充请多多评论促进交流!