java的注解

Posted 清浅岁月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于java的注解的主要内容,如果未能解决你的问题,请参考以下文章

Java 注解及其底层原理

spring注解预览

极*Java速成教程 -

Java千百问_03基础语法(020)_注解注释有什么区别

Java千百问_03基础语法(019)_注解是什么

JAVA里自定义注解来进行数据验证