博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础巩固笔记(6)-注解
阅读量:5951 次
发布时间:2019-06-19

本文共 5098 字,大约阅读时间需要 16 分钟。

hot3.png

java基础巩固笔记(6)-注解

标签: java


[TOC]


注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

API

注解的应用结构图

调用/结构关系:A<--B<--C

A,B,C解释如下:

A:注解类

@interface A{}

B:应用了“注解类”的类

@AClass B{}

C:对“应用了注解类的类”进行反射操作的类

Class C{   public void f(){     B.class.isAnnotationPresent(A.class);     A a = B.class.getAnnotion(A.class);   }}

元注解

元注解的作用就是负责注解其他注解。四个元注解分别是:@Target,@Retention,@Documented,@Inherited

  • @Retention

表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy中,包括RetentionPolicy.SOURCE,RetentionPolicy.CLASS(默认),RetentionPolicy.RUNTIME分别对应:java源文件-->class文件-->内存中的字节码

RetentionPolicy.SOURCE 注解将被编译器丢弃 RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
  • @Target

表示该注解用于什么地方,可能的值在枚举类ElemenetType中,包括

ElemenetType.CONSTRUCTOR 构造器声明 ElemenetType.FIELD 域声明(包括 enum 实例) ElemenetType.LOCAL_VARIABLE 局部变量声明 ElemenetType.METHOD 方法声明 ElemenetType.PACKAGE 包声明 ElemenetType.PARAMETER 参数声明 ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
  • @Documented

将此注解包含在javadoc中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当于@see,@param

  • @Inherited

允许子类继承父类中的注解

自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

定义注解格式:

public @interface 注解名 {定义体}

注解参数的可支持数据类型:

1.所有基本数据类型(int,float,boolean,byte,double,char,long,short) 2.String类型 3.Class类型 4.enum类型 5.Annotation类型 6.以上所有类型的数组

示例代码

参考文末的中

下面的示例,是上文提到的A<--B<--C的扩充版本。自定义了一个注解@A,然后在B类中使用了注解@A,最后在类C中利用反射读取@A中的信息

  • A.java
package com.iot.annotation;import java.lang.annotation.*;/** * Created by brian on 2016/2/20. */@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR})@Retention(RetentionPolicy.RUNTIME)public @interface A {    String name();    int id() default 0;    Class
gid();}
  • B.java
package com.iot.annotation;import java.util.HashMap;import java.util.Map;/** * Created by brian on 2016/2/20. */@A(name="type",gid=Long.class)//类注解public class B {    @A(name="param",id=1,gid=Long.class) //类成员注解    private Integer age;    @A(name="construct",id=2,gid=Long.class) //构造方法注解    public B(){}    @A(name="public method",id=3,gid=Long.class) //类方法注解    public void a(){    }    @A(name="protected method",id=4,gid=Long.class) //类方法注解    protected void b(){        Map
m = new HashMap
(0); } @A(name="private method",id=5,gid=Long.class) //类方法注解 private void c(){ Map
m = new HashMap
(0); } public void b(Integer a){ }}
  • C.java
package com.iot.annotation;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Method;/** * Created by brian on 2016/2/20. */public class C {    /**     * 简单打印出B类中所使用到的类注解     * 该方法只打印了 Type 类型的注解     * @throws ClassNotFoundException     */    public static void parseTypeAnnotation() throws ClassNotFoundException{        Class clazz = Class.forName("com.iot.annotation.B");        Annotation[] annotations = clazz.getAnnotations();        for(Annotation annotation :annotations){            A a = (A)annotation;            System.out.println("id = "+a.id()+" ;name = "+a.name()+" ;gid = "+a.gid());        }    }    /**     * 简单打印出B类中所使用到的方法注解     * 该方法只打印了 Method 类型的注解     */    public static void parseMethodAnnotation() {        Method[] methods = B.class.getDeclaredMethods();        for (Method method : methods) {            /*             * 判断方法中是否有指定注解类型的注解             */            boolean hasAnnotation = method.isAnnotationPresent(A.class);            if (hasAnnotation) {                /*                 * 根据注解类型返回方法的指定类型注解                 */                A annotation = method.getAnnotation(A.class);                System.out.println("method = " + method.getName()                        + " ; id = " + annotation.id() + " ; description = "                        + annotation.name() + "; gid= " + annotation.gid());            }        }    }    /**     * 简单打印出B类中所使用到的方法注解     * 该方法只打印了 Method 类型的注解     */    public static void parseConstructAnnotation(){        Constructor[] constructors = B.class.getConstructors();        for (Constructor constructor : constructors) {        	/*             * 判断构造方法中是否有指定注解类型的注解             */            boolean hasAnnotation = constructor.isAnnotationPresent(A.class);            if (hasAnnotation) {                /*                 * 根据注解类型返回方法的指定类型注解                 */                A annotation =(A) constructor.getAnnotation(A.class);                System.out.println("constructor = " + constructor.getName()                        + " ; id = " + annotation.id() + " ; description = "                        + annotation.name() + "; gid= "+annotation.gid());            }        }    }    public static void main(String[] args) throws ClassNotFoundException {        parseTypeAnnotation();        parseMethodAnnotation();        parseConstructAnnotation();    }}

参考资料


作者更多文章: | |

转载于:https://my.oschina.net/brianway/blog/618037

你可能感兴趣的文章
[leetcode-342-Power of Four]
查看>>
MongoDB3.0 创建用户
查看>>
2017-2018-1 20155319 《信息安全系统设计基础》第3周学习总结
查看>>
express 3.0.x 中默认不支持flash() 的解决方法
查看>>
uva-111-dp
查看>>
算法学习1——矩阵转置
查看>>
Tcl与Design Compiler (九)——综合后的形式验证
查看>>
跨页数据传递
查看>>
Linux查看系统负载(CPU和MEM考虑)
查看>>
Codeforces Round #249 (Div. 2) B. Pasha Maximizes
查看>>
【Android游戏开发十一】手把手让你爱上Android sdk自带“9妹”(9patch 工具),让Android游戏开发更方便!...
查看>>
【查找算法】基于存储的查找算法(哈希查找)
查看>>
JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现
查看>>
记录一下这次web实训的两个网站
查看>>
POJ-1830 开关问题 高斯消元
查看>>
HDU-4366 Successor 线段树+预处理
查看>>
做程序开发的你如果经常用Redis,这些问题肯定会遇到
查看>>
CAS-认证流程
查看>>
006android初级篇之jni数据类型映射
查看>>
Java 集合框架查阅技巧
查看>>