Java注解

注解机制简单的说就是给程序的元素(类、方法、属性)加上一个标记,然后在运行的时候通过反射机制获取该元素的标记,然后执行对应的逻辑,注解就相当于标记。

内建注解

Java中主要有以下三个默认注解:
1.Override 表示该方法将覆盖父类中方法
2.Deprecated 表示使用了废弃的不赞成使用的方法
3.SuppressWarning 表示抑制了程序的告警

元注解

元注解表示专门负责创建注解的注解
1.Document 说明该注解将被包含在javadoc中
2.Inherited 说明允许子类继承父类中的注解
3.Retention 注解的存活时间。SOURCE:存在源代码,注解将被编译器丢弃;CLASS:注解在编译后的class文件中可用,但会被VM丢弃;RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
4.Target 表示该注解可以用于什么地方,注解类型所适用的程序元素的种类。CONSTRUCTOR:构造器的声明;FIELD:域声明;LOCAL_VARIABLE:局部变量声明;METHOD:方法声明;PACKAGE:包声明;PARAMETER:参数声明;TYPE:类、接口(包括注解类型)或enum声明

自定义注解

定义一个注解StrRule,用于修饰对象字符串类型的属性。注解包含两个属性,range用于设置字符串的长度范围,name用于设置修饰的字符串的名称。

package com.victor.technology.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StrRule
{
    public String range();
    
    public String name();
}

定义一个对象Student,并在name属性使用StrRule注解:

package com.victor.technology.annotation;

public class Student
{
    @StrRule(range = "1-32", name = "Student Name")
    private String name;
    
    private int number;

    public Student(String name, int number)
    {
        this.name = name;
        this.number = number;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getNumber()
    {
        return number;
    }

    public void setNumber(int number)
    {
        this.number = number;
    }
}

定义一个测试类,通过反射机制获取对象属性的注解,并获取设置的注解的值,然后执行对应的业务逻辑(可以是数据校验,此处没有扩展实现)

package com.victor.technology.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class AnnotationTest
{

    public static void main(String[] args)
    {
        Student stu = new Student("victor", 1);
        Field[] fields = stu.getClass().getDeclaredFields();
        for(Field field : fields)
        {
            Annotation[] annotations = field.getAnnotations();
            for(Annotation annotation : annotations)
            {
                String annotationName = annotation.annotationType().getSimpleName();
                if(annotationName.equals("StrRule"))
                {
                    StrRule rule = (StrRule) annotation;
                    String range = rule.range();
                    String name = rule.name();
                    System.out.println("Range: " + range + ", name: " + name);
                }
            }
        }
    }

}

执行结果如下:

Range: 1-32, name: Student Name

你可能感兴趣的:(Java注解)