Java注解

1.1,注解的基本介绍:

1,注解,或者叫注释,英文单词是:Annotation

2,注解Annotation是一种引用数据类型。编译之后也是生成xxx.class文件  

3,注解怎么定义:

           语法格式:

                        [修饰符列表] @interface 注解类型名{

                

                        }

4,注解怎么使用,用在什么地方?

        第一:注解使用时的语法格式是:

                @注解类型名

        第二:注解可以出现在类上,属性上,方法上,变量上等......

                    注解还可以出现在注解上。         

代码示例:

自定义一个注解:

package annotation;

public @interface MyAnnotation {
    
}

注解的使用: 

package annotation;

@MyAnnotation
public class Test {

    @MyAnnotation
    private String name;

    @MyAnnotation
    public Test() {
    }

    @MyAnnotation
    public static void m1(){
        @MyAnnotation
        int i=100;
    }
}

1.2,注解的属性:

我们通常会在注解当中定义属性,

注意: 如果一个注解中有属性,那么必须给属性赋值。

             可以给一个默认值,使用时可以不写。(赋默认值如下例)

如何给属性赋值?

        在使用时通过:@注解类型名(属性名=属性值)的形式给属性赋值   

    注意:如果属性名时value,并且只有一个属性的话,在使用时,该属性名可以省略。

        

注解当中的属性可以时哪一种类型?

        属性的类型可以是:

                八种基本数据类型,String,Class,枚举类型,Annotation类型

Java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的

注意:属性也可以是数组(数组算是一种数据结构,里面的元素是Java的数据类型元素)。

对数组属性赋值的时候使用:属性名={属性值,属性值.....}

如果数组属性的属性值只有一个可以省略{}。

package annotation;

public @interface MyAnnotation {

    String name() default "";

    String[] value() default {};

    String[] urlPatterns() default {};

    int loadOnStartup() default -1;
}
package annotation;

@MyAnnotation(flag = true)
public class Test {

}

2,注解的分类

1,按照运行机制分:
        源码注解:注解只在源码中存在,编译成.class文件之后就不存在了。
        编译时注解:

                在源码以及.class文件中都存在,例如上面讲的三个jdk的注解,只在编译时起作用,例如@Override,在编译的时候告诉编译器我要覆盖父类的方法,如果没有覆盖就会报错


        运行时注解:在运行时还起作用,甚至会影响程序运行的逻辑的注解,比如spring的@Autowired,就会在程序运行的时候把成员变量自动的注入进来


2,按照来源分:
        来自jdk的注解
        来自第三方的注解(运用最多)
        自定义注解


3,元注解:给注解进行注解

3,JDK内置了哪些注解?

        掌握:

              1,  Deprecated               

    @Deprecated: 用于表示某个程序元素(类,方法等)已过时

                如果使用 Deprecated 去修饰一个类,表示这个类已经过时了,但过时不代表不能用了,即不推荐使用,仍然可以使用。

                不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。

               2,  Override

                @Override:表示方法声明的时候打算重写超类中的另一个方法的声明。

                在编译的时候告诉编译器我要覆盖父类的方法,如果没有覆盖就会报错

                3,SuppressWarnings

                @SuppressWarnings :该批注的作用是给编译器一条指令,

                                告诉它对被批注的代码元素(以及元素内部)的某些警告保持静默。

4,JDK常见的元注解:

      1,  什么是元注解?

                用来标注"注解类型"的"注解",称为元注解。

        2,常见的元注解有哪些?

                Target

                Retention

Target注解:

        这是一个元注解,用来标注“注解类型”的“注解”。

        Target注解用来标注“被标注的注解”可以出现在哪些位置上。

        ElementType是个枚举。属性作用如下:
        TYPE:接口、类、枚举
        FIELD:字段、枚举的常量
        METHOD:方法
        PARAMETER:方法参数
        CONSTRUCTOR:构造函数
        LOCAL_VARIABLE:局部变量
        ANNOTATION_TYPE:注解
        PACKAGE:包
如:

        @Target(ElementType.METHOD):表示“被标注的注解”只能出现在方法上。

 Retention

          这是一个元注解,用来标注“注解类型”的“注解”。

           这个注解用来标注“被标注的注解”最终保存在哪里。

1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。

5,获取注解对象

获取注解对象其实就是为了更好的操作类,作为一个标记。

第一步:通过反射机制,获取类,

第二步: 获取对象之前,可以判断是否存在该注解

                使用Class对象的isAnnotationPresent()方法。

第二步:通过类的getAnnotation()方法获取注解对象。

注意:可以通过:注解对象.value();的方式获取注解对象的属性

以下例子中:WebServlet也是一个注解。

package com.javaweb.servlet;

import javax.servlet.annotation.WebServlet;

public class ReflectAnnotation {
    public static void main(String[] args) throws ClassNotFoundException {
        //使用反射机制将类上面注解 进行解析。
        //获取类Class对象
        Class<?> aClass = Class.forName("com.javaweb.servlet.WelcomServlet");

        //获取这个类上面的注解
        //先判断这个类上面有没有这个注解对象,如果有这个注解对象,就获取该注解对象
        //boolean annotationPresent = aClass.isAnnotationPresent( WebServlet.class);
        //System.out.println(annotationPresent);

        if (aClass.isAnnotationPresent( WebServlet.class)) {
            //获取这个类上面的注解对象
            WebServlet annotation = aClass.getAnnotation(WebServlet.class);
           // System.out.println(annotation);
            //获取注解的value属性值
            String[] value = annotation.value();
            for (String s : value) {
                System.out.println(s);
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值