一、注解
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关键字给属性赋值后,在使用时可以不给属性赋值
自定义注解:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @Description: 自定义注解 * @ClassName: Anno * @Author: 橙汁one * @Date: 2021/3/11 20:55 * @Version: 1.0 */ public @interface Anno { //属性 int age(); String name(); AnyOne anyone(); }
声明的类型:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @Description: 枚举类型 * @ClassName: AnyOne * @Author: 橙汁one * @Date: 2021/3/11 20:57 * @Version: 1.0 */ public enum AnyOne { a,b,c }
测试类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @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; }
3.3、元注解
定义:所谓元注解就是声明其他注解的注解
元注解包括:
@Target():用于约束被声明的注解可以用在什么地方,类?包?方法?、、、、
type:类或接口、field:参数、method:可用于方法声明
@Retention():用于约束被声明注解的声明周期,可以保留在什么阶段。
source:源代码阶段,class:class文件阶段,runtime:运行阶段
@Documented:描述注解是否可以被抽取到api文档中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @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(); }
3.4解析注解
定义:解析注解一般情况就是通过反射来获取类、方法、属性上的注解。自己定义注解实现什么功能
个人理解:注解是位于功能类(完成一些功能)和使用类(使用功能类的地方)中间一层的东西,通过注解可以很方便为使用提供参数,这里的参数就hi是功能类或者是其他的一些东西
实例:
自定义注解:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @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();//类中方法名 }
功能类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @Description: 功能类 * @ClassName: People * @Author: 橙汁one * @Date: 2021/3/11 21:24 * @Version: 1.0 */ public class People { public void speak(){ System.out.println("hahhahahhahahhah"); } }
测试类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * @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); } }
二、泛型
1、概述:泛型实质上参数化类型,就是所操作的类型定义为一个参数。泛型可以用来类、接口、方法上
所谓泛型,就是指在类创建时不指定类中属性的参数类型,在外部操作或者实例化时才确定参数类型。
2、优点:
类型安全、消除强制转换类型、潜在的性能收益