注解

一、注解

  1、什么是注解?

    注解是一种代码级别的声明。在jdk1.5中引入,和类、接口属于同一层次,可以作用在包,类,字段,方法,局部变量和方法参数上,用来对这些元素进行说明、注释。

  2、方法作用的分类

    (1)、代码分析

    (2)、编译检查

    (3)、编写文档

  3、注解的分类

    3.1jdk内置注解

      @override@Deprecated@supresswarnings(有参数)

    3.2自定义注解

      Ⅰ、格式:     

【元注解】
public @interface 注解名称{}

        Ⅱ、本质

    注解本质上就是一个接口,默认继承annotation接口

public @interface xxx extends public.lang.annotation.Annotation{}

       Ⅲ、属性

    (1)特点:属性就是接口中的抽象方法,方法的返回值包括:

                  基本数据类型、String、枚举、类,以及异常类型的数组类型

    (2)注意:声明了属性,在使用时就要进行赋值

        ::如果只有一个属性,并且属性名是value,那么赋值时就可以省略属性

        ::如果属性是数组类型,写一个值时不用写[]

        ::如果定义属性时,使用default关键字给属性赋值后,在使用时可以不给属性赋值

自定义注解:

/**
 * @Description: 自定义注解
 * @ClassName: Anno
 * @Author: 橙汁one
 * @Date: 2021/3/11 20:55
 * @Version: 1.0
 */
public @interface Anno {
    //属性
    int age();
    String name();
    AnyOne anyone();
}
View Code

声明的类型:

/**
 * @Description: 枚举类型
 * @ClassName: AnyOne
 * @Author: 橙汁one
 * @Date: 2021/3/11 20:57
 * @Version: 1.0
 */
public enum AnyOne {
    a,b,c
}
View Code

测试类:

/**
 * @Description: 测试类
 * @ClassName: People
 * @Author: 橙汁one
 * @Date: 2021/3/11 20:58
 * @Version: 1.0
 */
@Anno(age=12,name = "jj",anyone = AnyOne.a)
public class People {
    private int dd;
}
View Code

    3.3、元注解

      定义:所谓元注解就是声明其他注解的注解

      元注解包括:

      @Target():用于约束被声明的注解可以用在什么地方,类?包?方法?、、、、

                type:类或接口、field:参数、method:可用于方法声明

      @Retention():用于约束被声明注解的声明周期,可以保留在什么阶段。

                source:源代码阶段,class:class文件阶段,runtime:运行阶段

      @Documented:描述注解是否可以被抽取到api文档中

/**
 * @Description: 自定义注解
 * @ClassName: Anno
 * @Author: 橙汁one
 * @Date: 2021/3/11 20:55
 * @Version: 1.0
 */
@Target(ElementType.FIELD)//约束Anno可以用于声明属性
@Retention(RetentionPolicy.RUNTIME)//约束Anno的生命周期在运行时
@Documented
public @interface Anno {
    //属性
    int age();
    String name();
    AnyOne anyone();
}
View Code

     3.4解析注解

      定义:解析注解一般情况就是通过反射来获取类、方法、属性上的注解。自己定义注解实现什么功能

    个人理解:注解是位于功能类(完成一些功能)和使用类(使用功能类的地方)中间一层的东西,通过注解可以很方便为使用提供参数,这里的参数就hi是功能类或者是其他的一些东西

      实例:

  自定义注解:

/**
 * @Description: 自定义注解
 * @ClassName: Anno
 * @Author: 橙汁one
 * @Date: 2021/3/11 21:22
 * @Version: 1.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
    String classname();//全类名
    String methodname();//类中方法名
}
View Code

  功能类:

/**
 * @Description: 功能类
 * @ClassName: People
 * @Author: 橙汁one
 * @Date: 2021/3/11 21:24
 * @Version: 1.0
 */
public class People {
    public void speak(){
        System.out.println("hahhahahhahahhah");
    }
}
View Code

  测试类:

/**
 * @Description: 测试类
 * @ClassName: DemoTest
 * @Author: 橙汁one
 * @Date: 2021/3/11 21:25
 * @Version: 1.0
 */
@Anno(classname = "com.fy.demo.demo3.People",methodname = "speak")
public class DemoTest {
    public static void main(String[] args) throws Exception {
//        通过反射获取注解中的参数
//        获取该类的字节码文件
        Class<DemoTest> dt=DemoTest.class;
//        获取上边的注解对象
        Anno anno = dt.getAnnotation(Anno.class);
//        获取注解中的属性
        String classname = anno.classname();
        String methodname = anno.methodname();
//        将类加载进内存
        Class<?> aClass = Class.forName(classname);
//        创建类对象
        Object o = aClass.newInstance();
//         根据方法名获取方法对象
        Method method = aClass.getMethod(methodname);
//        方法执行
        method.invoke(o);
    }
}
View Code

二、泛型

  1、概述:泛型实质上参数化类型,就是所操作的类型定义为一个参数。泛型可以用来类、接口、方法上

    所谓泛型,就是指在类创建时不指定类中属性的参数类型,在外部操作或者实例化时才确定参数类型。

  2、优点:

    类型安全、消除强制转换类型、潜在的性能收益

原文地址:https://www.cnblogs.com/fbbg/p/14520605.html