java 注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/with_dream/article/details/77888670

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

展开阅读全文

没有更多推荐了,返回首页