登录 立即注册
安币:

楼主: 应用安卓

java进阶之自定义注解 ,java中自定义异常

[复制链接]

451

主题

962

帖子

1975

安币

手工艺人

发表于 2018-1-9 17:07:09 | 显示全部楼层 |阅读模式
一、简介

        注解是Java 1.5引入的,可以提供代码的额外信息,目前正在被广泛应用。除了Java内置注解,我们也可以自定义注解。


        以下就是一个自定义注解的简单例子:


[Java] 查看源文件 复制代码
@Target(ElementType.TYPE) //注解作用于类型(类,接口,注解,枚举)
@Retention(RetentionPolicy.RUNTIME) //运行时保留,运行中可以处理
@Inherited // 注解将被用于该类的子类
@Documented // 生成javadoc文件
public @interface JsAnnotation {

    String DEFAULT_VALUE = "JS";

    /**
     * 创建此value方法,则使用注解时可直接传参,如 @JsAnnotation("msg")
     *
     * @return
     */
    String value() default DEFAULT_VALUE;

}

        自定义注解关键点:



        @interface关键字定义注解


        注解可以被其它注解修饰,最重要的就是元注解


        注解和接口类似,内部可以定义常量和方法


        注解定义的方法有一些限制:方法不能有参数;返回值只能是基本类型、字符串、Class、枚举、注解、及以上类型的数组;可以包含默认值



二、元注解介绍

        元注解就是定义注解的注解。


        包含@Target、@Retention、@Inherited、@Documented这四种


1、@Target

        描述注解的使用目标。


        其源码为:


[Java] 查看源文件 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Target {
    ElementType[] value();
}

        注解方法返回值是ElementType[],ElementType枚举类型,枚举值就是@Target注解的可取值。


        方法名value,这样在使用注解时,可以不需要指定方法名。


        可取的值有:





取值
含义




ElementType.PACKAGE
注解作用于包


ElementType.TYPE
注解作用于类型(类,接口,注解,枚举)


ElementType.ANNOTATION_TYPE
注解作用于注解


ElementType.CONSTRUCTOR
注解作用于构造方法


ElementType.METHOD
注解作用于方法


ElementType.PARAMETER
注解作用于方法参数


ElementType.FIELD
注解作用于属性


ElementType.LOCAL_VARIABLE
注解作用于局部变量



        注意:默认可以作用于以上任何目标。


2、@Retention

        描述注解的生命周期。


        其源码为:


[Java] 查看源文件 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
    RetentionPolicy value();
}

        注解方法返回值是枚举类型RetentionPolicy,枚举值就是@Retention注解的可取值。


        可取的值有:





取值
含义




RetentionPolicy.SOURCE
源码中保留,编译期可以处理


RetentionPolicy.CLASS
Class文件中保留,Class加载时可以处理


RetentionPolicy.RUNTIME
运行时保留,运行中可以处理



        默认RetentionPolicy.CLASS 值。


3、@Documented

        描述注解可以文档化,是一个标记注解。


        在生成javadoc的时候,是不包含注释的,但是如果注解被@Documented修饰,则生成的文档就包含该注解。


        其源码为:


[Java] 查看源文件 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}
4、@Inherited

        标记注解,使用@Inherited修饰的注解作用于一个类,则该注解将被用于该类的子类。


        其源码为:


[Java] 查看源文件 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}
三、自定义注解示例
1、定义注解
[Java] 查看源文件 复制代码
@Target(ElementType.TYPE) //注解作用于类型(类,接口,注解,枚举)
@Retention(RetentionPolicy.RUNTIME) //运行时保留,运行中可以处理
@Inherited // 注解将被用于该类的子类
@Documented // 生成javadoc文件
public @interface JsAnnotation {

    String DEFAULT_VALUE = "JS";

    /**
     * 颜色枚举
     *
     * @author peida
     */
    enum Color {
        BULE, RED, GREEN
    }

    /**
     * 创建此value方法,则使用注解时可直接传参,如 @JsAnnotation("msg")
     *
     * @return
     */
    String value() default DEFAULT_VALUE;

    /**
     * 此方法返回为枚举类型,使用注解时,如 @JsAnnotation(color=Color.BLUE)
     *
     * @return
     */
    Color color() default Color.BULE;

    int num() default -1;
}

        其中:定义了三个方法,三个方法都有默认返回值。定义了Color枚举(因为注解的方法可以返回枚举类型)


        这里注意:



        value方法:使用注解时可直接传参,如 @JsAnnotation("msg")


        普通方法:使用注解时,如 @JsAnnotation(color=Color.BLUE)



2、使用注解
[Java] 查看源文件 复制代码
@JsAnnotation("jia shuai")
public class AnnotationTest {
    
}

        或


[Java] 查看源文件 复制代码
@JsAnnotation(num = 100)
public class AnnotationTest {
    
}

        或


[Java] 查看源文件 复制代码
@JsAnnotation(color = Color.BLUE)
public class AnnotationTest {
    
}
3、获取注解
[Java] 查看源文件 复制代码
public static void main(String[] args) {
    AnnotationTest test = new AnnotationTest();
    Class tClass = test.getClass();
    JsAnnotation jsAnnotation = (JsAnnotation) tClass.getAnnotation(JsAnnotation.class);

    System.out.println(jsAnnotation.value());
    System.out.println(jsAnnotation.color());
    System.out.println(jsAnnotation.num());
}

        更多精彩内容关注我的微信公众号——Android机动车


        

        


发表于 2018-1-10 11:37:56 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!

0

主题

9191

帖子

2425

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-11 04:07:45 | 显示全部楼层
感谢分享,楼主V5~

14

主题

9233

帖子

4745

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-1-12 03:08:18 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

4

主题

9442

帖子

810

安币

代码手工艺人

Rank: 4

发表于 2018-1-13 11:41:23 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表