注解的初理解

注解

注解是java中给代码注释的,java中自带常用的注解有@Override是表重写父类方法的注解

元注解:java有四个元注解,有了这四个元注解我们就可以自己定义注解了

@Target
/*
描述了注解修饰的对象范围,取值在java.lang.annotation.ElementType定义
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述方法变量
TYPE:用于描述类、接口或enum类型
*/

@Retention
/*
表示注解保留时间长短。取值在java.lang.annotation.RetentionPolicy定义
RetentionPolicy.SOURCE -------------注解将被编译器丢弃
RetentionPolicy.CLASS -------------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME ---------VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息
RUNTIME > CLASS > SOURCE
自定义注解一般使用RUNTIME
*/

@Documented
/*
Documented注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
*/

@Inherited
/*
Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)
*/

下面是自定义的注解:

//定义个自己的注解
@Target({ElementType.METHOD,ElementType.TYPE})//METHOD可以在方法上使用,TYPE可以在类上使用
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    String name() default "";  //前面(String)是关键字,name()是变量名,default表示默认的值
    int age() default 0;       //如果定了的变量,没有给默认值,使用注解时需要传入值
    int id() default 1;

    String[] schools() default {"重庆交通大学"}; //定义一个数组变量
}

反射获取注解:

public class Test02 {
    public static void main(String[] args) throws Exception {
        Class<?> aClass = Class.forName("TestDemo.annotation.Person");

        System.out.println("获取全部注解:");
        Annotation[] annotations = aClass.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        System.out.println("=============================================");

        System.out.println("获取指定类上的注解:");
        MyType annotation = aClass.getAnnotation(MyType.class);
        System.out.println(annotation);
        System.out.println(annotation.value());
        System.out.println("=============================================");

        System.out.println("获取指定属性上的注解");
        Field name = aClass.getDeclaredField("name");
        MyField myField = name.getAnnotation(MyField.class);
        System.out.println(myField);
        System.out.println(myField.columnName());
        System.out.println(myField.type());
        System.out.println(myField.length());

    }
}

@MyType("sql_value")
class Person{

    @MyField(columnName = "sql_value",type = "int",length = 11)
    private int id;
    @MyField(columnName = "sql_value",type = "int",length = 11)
    private int age;
    @MyField(columnName = "sql_value",type = "String",length = 20)
    private String name;

}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyType{
    String value();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyField{
    String columnName();
    String type();
    int length();
}

/*
结果:

获取全部注解:
@TestDemo.annotation.MyType(value=sql_value)
=============================================
获取指定类上的注解:
@TestDemo.annotation.MyType(value=sql_value)
sql_value
=============================================
获取指定属性上的注解
@TestDemo.annotation.MyField(columnName=sql_value, type=String, length=20)
sql_value
String
20

*/
posted @ 2022-05-22 14:10  水三丫  阅读(45)  评论(1编辑  收藏  举报