注解(Annotation)最大的好处是让代码更加简洁,具有更高的可读性。 注解这个词不是很好理解,比较抽象,可以理解成注解是写在变量,方法,类名之类元素上方,用来表达这些元素附加的一些信息。
元注解的意思是可以通过他们来创造更多的自定义注解。
@Target 表示该注解的作用位置,可选的位置有
@Retention 表示该注解的级别。可选的范围有:
表示在生产 JavaDoc 文档的时候把注解信息也包含进去。对于不部分人和团队来说,呵呵~~
表示子类运行继承父类的注解。
注解的还是比较简单的,但是不好理解。重点在于反射能不能理解。关于反射,参考这个
咱们拿 butterknife 大致的思想来分析一下。
咱们一般这样使用 bufferknife :
public class DoctorActivity extends Activity{
@InjectView(R.id.doctor_age)
private TextView mDoctorAge;
public void onCreate(Bundle saveInstanceState){
BufferKnife.inject(this);
}
}
这里干了这么几件事:
然后 @InjectView 大概是这样子的:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HDFInjectView {
int value();
}
这个注解大概表达了以下几个意思:
然后 BufferKnife.inject() 大概是这样子的:
public static void inject(Activity activity){
Class clazz = activity.getClass();
Log.i(TAG,"class = " + clazz);
Field[] fields = clazz.getDeclaredFields();
Log.i(TAG, "Fields is = " + fields);
for(Field field : fields){
HDFInjectView inject = field.getAnnotation(HDFInjectView.class);
Log.i(TAG,"inject = " + inject + " field = " + field);
if(inject != null){
int id = inject.value();
View view = activity.findViewById(id);
Log.i(TAG,"view = " + view);
try {
field.setAccessible(true);
field.set(activity,view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
主要的步骤是这样的:
所有这些等于:
mDoctorAge = (TextView)findViewById(R.id.doctor_age);
上面就简单的实现了 BufferKnife 的 视图(View)的依赖注入这部分的功能。
这种方式从代码编写的角度上来说,会让代码更加简洁,漂亮,但是牺牲的是性能。
- EOF -
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。
转载请注明:文章转载自 Binkery 技术博客 [https://binkery.com]
本文标题: Java 注解 Annotation
本文地址: https://binkery.com/archives/499.html