java 注解

来源:互联网 发布:雷电网络 价格 编辑:程序博客网 时间:2024/06/06 00:02

1、简介

注解(也叫元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后的某个时刻可以方便的使用它们。

1.2 标准注解

java内部提供了三种内置注解
@Override :保证重写方法时的正确性
@Deprecated:对不应该使用的方法添加的标记
@SuppressWarnings:关闭不当的编译器警告。

1.3 基本语法

元注解是注解的注解,有四类

@Target 标记注解使用的地方 定义在ElementType中
TYPE 类、接口或enum
FIELD, 域声明(域代表变量所处的上下文,如静态域即静态变量、全局域即全局变量等),包括enum
CONSTRUCTOR:用于描述构造器
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数

@Retention:代表注解的级别 定义在RetentionPolicy中
SOURCE:只在源文件中有效 会被编译器丢弃
CLASS:在class文件中有效 jvm会忽略
RUNTIME:在运行时有效 可以使用反射读取注解信息

@Documented 将注解包含在javadoc中

@Inherited:允许子类继承父类的注解

1.4 注解元素的类型限制

注解可以使用的类型有:

所有基本类型
String
Class
enum
Annotation
以上所有类型的数组

注解的元素要么有确定的默认值,要么在使用注解时提供。且非基本类型的元素不能赋为null。所以一般会赋一些特殊的值,如-1或空字符

1.5 获取注解信息

getAnnotations(): 返回该元素的所有注解,包括没有显式定义该元素上的注解。
isAnnotationPresent(annotation): 检查传入的注解是否存在于当前元素。
getAnnotation(class): 按照传入的参数获取指定类型的注解。返回null说明当前元素不带有此注解。

1.6 自定义注解

// 注解会在class字节码文件中存在,在运行时可以通过反射获取到@Retention(RetentionPolicy.RUNTIME)//定义注解的作用目标**作用范围字段、枚举的常量/方法@Target({ElementType.FIELD,ElementType.METHOD})//说明该注解将被包含在javadoc中@Documented                                public @interface AnTest {    /**     * 字段名称     * @return     */    String name() default "";    /**     * 是否为序列号     * @return     */    int id() default -1;}
public class Test{    //带注解的字段    @AnTest(name = "an name", id = 5)    String name;    //带注解的方法    @AnTest(name="get")    String get(){        return "test";    }    public static void main(String[] args) {        try {            Class clazz = Class.forName("com.company.Test");            // 提取到被注解的方法Method,这里用到了反射            Method method = clazz.getDeclaredMethod("get");            // 从Method方法中通过方法getAnnotation获得我们设置的注解            AnTest anTest = method.getAnnotation(AnTest.class);            System.out.println("get name==>"+anTest.name()+"  id==>"+anTest.id());            //通过反射获取字段            Field nameField = clazz.getDeclaredField("name");            //根据Field获取注解类AnTest            AnTest anTest1 = nameField.getAnnotation(AnTest.class);            System.out.println("name name==>"+anTest1.name()+"  id==>"+anTest1.id());        } catch (NoSuchMethodException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (NoSuchFieldException e) {            e.printStackTrace();        }    }}

参考:
http://www.importnew.com/14227.html

原创粉丝点击