Java 注解机制/泛型机制
一、注解机制
1. 注解
A. 定义:注解是JDK5中引入的一个新特性,用于对代码进行说明,可以对包、类、接口、方法、字段、局部变量等进行注解;
B. 注解中内容获取:通过反射(java.lang.reflect.AnnotatedElement)获取注解中内容如:属性。
2. Java自带注解
A. @Override:重写实现类中某个方法;
B. @Deprecated:标明某个类或方法过时;
C. @SuppressWarnings:标明要忽略的警告。
3. 元注解
A. @Retention:标明注解被保留的时间范围;
public enum RetentionPolicy { SOURCE, // 源文件保留 CLASS, // 编译期保留,默认值 RUNTIME // 运行期保留,可通过反射去获取注解信息 }
B. @Target:标明注解使用的范围;
public enum ElementType { TYPE, // 类、接口、枚举类 FIELD, // 成员变量(包括:枚举常量) METHOD, // 成员方法 PARAMETER, // 方法参数 CONSTRUCTOR, // 构造方法 LOCAL_VARIABLE, // 局部变量 ANNOTATION_TYPE, // 注解类 PACKAGE, // 可用于修饰:包 TYPE_PARAMETER, // 类型参数,JDK 1.8 新增 TYPE_USE // 使用类型的任何地方,JDK 1.8 新增 }
C. @Inherited:标明注解可以被子类继承;
D. @Documented:标明在使用javadoc工具为类生成帮助文档时是否要保留其注解信息;
E. @Repeatable:重复注解,允许在同一申明类型(类、属性和方法)的多次使用同一个注解,创建自定义注解时,加上该注解并指向存储注解,就可以重复使用自定义注解,如@ComponentScan,是JDK 1.8新增的;
F. @Native:使用注解修饰成员变量,表示这个变量可以被本地代码引用,是JDK 1.8新增的;
4. 注解实现原理:注解@interface 是一个实现了Annotation接口的 接口, 然后在调用getDeclaredAnnotations()方法的时候,返回一个代理$Proxy对象,这个是使用jdk动态代理创建,使用Proxy的newProxyInstance方法时候,传入接口 和InvocationHandler的一个实例(也就是 AnotationInvocationHandler ) ,最后返回一个代理实例;期间,在创建代理对象之前,解析注解时候 从该注解类的常量池中取出注解的信息,包括之前写到注解中的参数,然后将这些信息在创建 AnnotationInvocationHandler时候 ,传入进去 作为构造函数的参数;当调用该代理实例的获取值的方法时,就会调用执行AnotationInvocationHandler里面的逻辑,将之前存入的注解信息 取出来。
5. 自定义注解
A. 定义:自定义注解就是根据自己的需求定义注解,并用元注解对自定义注解进行注解;
B. 作用:使配置化变成注解化、继承实现到注解实现、实现模块解耦如:AOP和shiro权限注解。
二、泛型机制
1. 泛型
A. 定义:泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制即类型擦除,省去了强制转换,避免ClassCastException。泛型的本质是为了参数化类型,也就是说所操作的数据类型被指定为一个参数;
B. 类型擦除:将所有的泛型表示即尖括号中的内容都替换为具体的类型;
C. 意义:适用于多种数据类型执行相同代码,即代码复用;
D. 泛型参数类型的获取:通过反射(java.lang.reflect.Type)获取泛型。
2. 通配符
A. ?:表示不确定的java类型,若是多个限制,采用&符号,通常用于泛型方法的调用代码和形参;
?:无界通配符
<? extends E>:上界通配符,表明参数化类型可能是所指定的类型,或者此类型的子类;
<? super E>:下界通配符,表明参数化类型可能是所指定的类型,或者此类型的父类;
B. T(type):表示一个具体的java类型,通常用于泛型类和泛型方法的定义;
C. K V(key value):分别代表java键值中的key value;
D. E(element):代表Element;
E. S(Subtype):
3. 分类
A. 泛型类:分一元泛型(T)和多元泛型(K V);
B. 泛型接口
C. 泛型方法:是在调用方法的时候指明泛型的具体类型;
4. 类型擦除带来的局限性
A. 泛型不支持8种基本数据类型;
B. 不能实例化泛型类型;
C. 不能创建具体类型的泛型数组。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2019-07-25 Linux 常用命令集