java的注解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值