java的注解
为什么使用注解
1.注解,统一代码风格,易于理解框架类代码
2.编程简洁,代码清晰
3.跟踪代码依赖性,实现替代配置文件功能
4.输出编码文档
java的注解的使用
jdk自带的注解
一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会产生警告信息,可以设定在程序里的所有的元素上.
一个是@SuppressWarnings:这一个类型可以用来暂时把一些警告信息消息关闭.
元注解
通过元注解,自定义注解
1.@Documented
目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息.
2.@Retention
指定生命周期,有三种生命周期:
RUNTIME,在运行时存在,可以通过反射读取;
OURCE,只在源码显示,编译时丢弃;
CLASS(编译时记录到class中,运行时忽略)
3.@Target
ElementType是用来指定Annotation类型的作用范围,指定是METHOD就只能在方法上使用.说明一下:TYPE(类型), FIELD(属性), METHOD(方法),PARAMETER(参数), CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上.
未指定,都可以使用。
4.@Inherited
它允许子注解继承它
通过元注解自定义注解
@Target({ElementType.METHOD,ElementType.TYPE})
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Description{
String desc();
String auther();
int age() default 18;
}
使用方式
@Description(desc="im desc",auther = "sdf",age = 12)
private void toast(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
解析注解
通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
暂时为未了解到好处,记录一下反编译获取注解
类注解的获取
try {
// 使用类加载器加载类
Class c = Class.forName("com.test.Child");
// 找到类上面的注解
boolean isExist = c.isAnnotationPresent(Description.class);
// 上面的这个方法是用这个类来判断这个类是否存在Description这样的一个注解
if (isExist) {
// 拿到注解实例,解析类上面的注解
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.value());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
方法注解的获取
//获取所有的方法
Method[] ms = c.getMethods();
// 遍历所有的方法
for (Method m : ms) {
boolean isExist1 = m.isAnnotationPresent(Description.class);
if (isExist1) {
Description d1=m.getAnnotation(Description.class);
System.out.println(d1.value());
}
}
@IntDef @StringDef的使用
使用InDef和StringDef代替使用枚举类的原因:
Enum 是 java 中一种包含固定常数的类型
当我们需要预先定义一些值,并限定范围时,使用 Enum,来做到编写和编译都查错
Java 的 Enum 的实质是特殊单例的静态成员变量
Enum 可以在编写器,编译器做到各种静态检查防呆
Enum 在运行期,所有枚举类作为单例,全部加载到内存中
因为上述原因,Enum 增加了APK 的内存占用,比常量多5到10倍的内存占用
所以放弃枚举,就是关于安卓应用性能的内存占用部分的最佳实践方法之一
使用 Enum 的缺点:
每一个枚举值都是一个单例对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存
较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的IO开销,使我们的应用需要更多的空间
特别是分dex多的大型APP,枚举的初始化很容易导致ANR
使用Def需要依赖:
com.android.support:support-annotations:xxx.xxx.xxx