andorid注解使用
2019-08-07 本文已影响0人
ghost9527
最近使用retrofit时,发现其使用了大量的注解,联想以前的butterknife等,发现注解也是很好用与有意思的东西,这里就做下记录,方便自己以后使用。
1、注解的定义
注解大致意义就是对一个方法与数据进行描述,打个比方如果一个方法过时了提示用户可以再方法之上加上@Deprecated
,这样编辑器中的方法就会画上横线如下:
通过源码我们也会发现注解必须使用
@interface
来描述。
2、注解大致分类
2.1运行时注解(Runtime)
通过反射机制运行处理的注解
2.2编译时注解(Compile time)
通过注解处理器生成编译时文件预先处理
3、元注解
原始的注解,用来给注解进行注解的注解。
@Retention:定义注解的保留策略
public enum RetentionPolicy {
/**
* 注解仅存在于源码中,在class字节码文件中不包含,只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings
*/
SOURCE,
/**
* 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,在编译时进行一些预处理操作,比如生成一些辅助
* 代码(如 ButterKnife)
*/
CLASS,
/**
* 注解会在class字节码文件中存在,在运行时可以通过反射获取到,需要在运行时去动态获取注解信息
*/
RUNTIME
}
@Target:定义注解的作用目标
public enum ElementType {
/** 接口、类、枚举、注解*/
TYPE,
/** 字段声明(包括枚举常量) */
FIELD,
/** 方法声明 */
METHOD,
/** 方法参数声明*/
PARAMETER,
/** 构造函数声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包声明 */
PACKAGE,
/**
* 泛型参数声明
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 泛型使用
* @since 1.8
*/
TYPE_USE
}
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
3、如何自定义注解
首先要创建一个注解
@Documented
@Target(ElementType.TYPE)//声明类之上
@Retention(RetentionPolicy.RUNTIME)//运行时
public @interface setContentView {
int value();//需要的参数,int类型
}
之后再activity的类名上添加注解
@setContentView(R.layout.activity_main)
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AnnotationUtil.setContentView(this);//反射获取注解参数并添加布局
}
}
最后是工具类
public class AnnotationUtil {
public static void setContentView(Activity activity) {
Class a = activity.getClass();
if (a.isAnnotationPresent(setContentView.class)) {
// 得到activity这个类的ContentView注解
setContentView contentView = (setContentView) a.getAnnotation(setContentView.class);
// 得到注解的值
int layoutId = contentView.value();
// 使用反射调用setContentView
try {
Method method = a.getMethod("setContentView", int.class);
method.setAccessible(true);
method.invoke(activity, layoutId);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
效果图就不放了,通过这些可以实现很多方便快捷的操作,类如findviewbyid通过注释减少代码量等等。
其他的一些注解大家可以去网上查阅或者源码中查看,主要都是api提供的,如java.lang
、java.lang.annotation
、java.annotation
,android.annotation
,android.support.annotation
中的注解等等。不少三方库中也有注解使用。