zoukankan      html  css  js  c++  java
  • Java基础—注解的使用



    1、注解的概述:

    注解是用来替代配置文件的!你回忆一下,我们以前总是要写一些配置文件,例如web.xml你还记得么?里面要写<servlet>和<servlet-mapping>!谁来读配置文件呢?当然是Tomcat!谁来写配置文件呢?当然是我们来写了!

    在Servlet3.0中就可以使用使用注解来代替配置文件,开发者就不用再写配置文件了,而是写注解,然后Tomcat来读取注解。

    注解也是类,需要定义了才能使用!

    分别在Servlet3.0中有一个注解类为@WebServlet,然后我们就可以在Servlet中使用@WebServlet中使用这个注解了。这个注解就是用来替代<servlet>了。然后Tomcat会通过反射来读取注解中的信息!


    小结:

      注解的语法:@注解名称
      注解的作用:替代xml配置文件!




    2、Java中的注解:

    • @Overrid:作用在方法上的注解。当方法不是重写父类的方法时会报错;
    • @Deprecated:作用在方法上。标记该方法为作废方法(已过时);
    • @SuppressWarnings:作用在方法上,压制警告。



    3、注解的使用:

    • 定义注解类:框架的工作
    • 使用注解:我们的工作
    • 读取注解(反射):框架的工作


    4、定义注解类:

    定义注解类不能使用class、enum,也不能使用interface,而是使用@interface

    eg.   
    public @interface MyAnn{}


    5、使用注解的目标:

    注解可以使用在类(接口或枚举)、属性、方法、构造器、包、参数、局部变量

    eg.

    package cn.ywq;
    
    @MyAnn
    public class MyClass {
    	@MyAnn
    	private int a;
    	@MyAnn
    	public MyClass() {}
    	@MyAnn
    	public void fun1() {}
    	@MyAnn
    	public void fun2(@MyAnn String s) {
    		@MyAnn
    		int n = 10;
    	}
    }
    



    6、注解的属性:

    定义注解时,也可以给出属性。

    public @interface MyAnn {
    	String value();
    	int value1();
    }
    

    其中value就是属性!你可能会说,它是一个方法!没错,它是一个方法,但我们非要称之为属性,因为把它当做属性更加好理解。

    当为注解指定属性后,那么在使用注解时就必须要给属性赋值了:

    @MyAnn(value1=100,value="hello")
    public class MyClass {
    }
    

    注解的属性还可以有默认值,在使用注解时就可以不给带有默认值的属性赋值了。但没有给出默认值的属性还是要赋值的。

    public @interface MyAnn {
    	String value() default "hello world"; 
    	int value1();
    }
    @MyAnn(value1=100) 
    public class MyClass {
    }
    

    在使用注解时,如果只给名为value的属性赋值,那么可以不给出属性的名称直接给出值。

    public @interface MyAnn {
    	String value() default "hello world";
    	int value1() default 100;
    }
    @MyAnn() 
    public class MyClass {
    }
    @MyAnn(value="hello") 
    public class MyClass {
    }
    @MyAnn(value1=200) 
    public class MyClass {
    }
    @MyAnn(value="hello",value1=200) 
    public class MyClass {
    }
    @MyAnn("hello annocation") 
    public class MyClass {
    }
    @MyAnn(300) 
    public class MyClass {
    }
    @MyAnn("hello",value1=200) 
    public class MyClass {
    }
    

    • 注解的属性后面要有一对圆括号,而且圆括号内不能给出东西。就像是无参的方法一样;
    • 注解的属性类型只能是:基本类型、String、Enum、Class、注解类型、以上类型的一维数组类型;
    • 注解的属性可以有默认值,例如:int a() default 100;
    • 数组的属性默认值:int[] arr() default {1,2,3},这里不能使用new int[]{1,2,3}
    • 使用注解时,在给数组属性赋值时的格式:@MyAnn(arr={1,2,3});

    注解属性的类型
        > 8种基本类型
        > String
        > Enum
        > Class
        > 注解类型
        > 以上类型的一维数组类型


        当给数组类型的属性赋值时,若数组元素的个数为1时,可以省略大括号。

    eg

    @MyAnno1(   //相当于一个注解对象
    	a=100,
    	b="hello",
    	c=MyEnum1.A,
    	d=String.class,
    	e=@MyAnno2(aa=200, bb="world"),    所以此处e也得是一个注解对象
    	f=100    //省略了大括号
    )
    public class Demo3 {
    
    }
    
    @interface MyAnno1 {
    	int a();
    	String b();
    	MyEnum1 c();
    	Class d();
    	MyAnno2 e();
    	int[] f();
    }
    @interface MyAnno2{
           int aa();
           String bb();
    }


    7、注解的作用目标:

    在定义注解时可以限制注解的作用目录!例如让注解只能作用在类和方法上。

    这需要使用元注解:@Target。该注解有一个属性value,类型为ElementType[],它是枚举类型。


    Target注解的源码如下:

    public @interface Target {
        ElementType[] value();
    }
    public enum ElementType {
      TYPE,FIELD,METHOD,PARAMETED,CONSTRUCTOR,LOCAL_VARIABLE,ANNOCATION_TYPE,PACKAGE
    }
    

    在定义注解时,可以使用@Target注解来限制注解的作用目标:

    @Target({ElementType.TYPE, ElementType.METHOD})
    public @interface MyAnn {
    }
    


    这样MyAnn就只能作用在类和方法上的!其中ElementType.TYPE表示类和接口。

    @MyAnn()
    public class MyClass {
    	@MyAnn()  //报错
    	private int a;
    	
    	@MyAnn()
    	public void fun() {}
    }
    



    8、注解的保留策略:

    • 注解的保留策略是指,注解是只保留在源代码上,还是保留到class文件上,再或者是类在运行时,可以被类加载器加载到内存中。
    • 如果希望注解被反射,那么注解就要保留到运行时,而不是源代码或类文件上。
    • 指定注解的保留策略需要使用元注解@Retention,它有一个value属性,类型为RetentionPolicy类型,RetentionPolicy是枚举类型:

    public @interface Retention {
        RetentionPolicy value();
    }
    public enum RetentionPolicy {
        SOURCE, CLASS, RUNTIME
    }
    

    下面代码是指定注解保留到运行时

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.METHOD})
    public @interface MyAnn {
    	String value() default "hello";
    	int value1() default 100;
    }
    








  • 相关阅读:
    sort
    Sicily--17956. Maximum Multiple
    代码1005
    487-3279的解法实例
    487-3279另一种解法
    487-3279
    人工智能--识别句子
    1003-Hangover
    推荐书单(转自GITHUB)
    转自微信号:测试那点事
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467260.html
Copyright © 2011-2022 走看看