JDK1.5新特性之注解
时间:2017-1-2 20:14
——注解的概述
注释是给人看的,而注解是给程序(框架)看的。
在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解,然后Tomcat来读取注解。
注解也是类,需要定义了才能使用。
在Servlet3.0中又一个注解类是@WebServlet,然后我们就可以在Servlet中使用@WebServlet这个注解了,这个朱姐就是用来替代<servlet>,然后Tomcat会通过反射来读取注解中的信息。
* @Deprecated:作用在方法上,标记该方法为作废方法(已过时)。
* @SuppressWarnings:作用在方法上,压制警告。
定义注解类不能使用class、enum和interface,而是使用@interface
> public @interface MyAnn{ }
——使用注解目标
所有注解都是Annotation的子类。
注解可以作用在:类(接口或枚举)、属性、方法、构造器、包、参数、局部变量
* 定义注解类:框架的工作
* 使用注解:我们的工作
* 读取注解(反射):框架的工作
* 定义属性
> 格式:类型 属性名()
* 使用注解时给属性赋值
> @MyAnno(name="zhangsan", age=20)
* 注解属性的默认值
> int age() default 100;
> 在使用注解时,可以不给带有默认值的属性赋值。
* 名为value的属性的特权
> 在使用注解时,如果只给名为value的属性赋值,那么可以不给出属性的名称而直接赋值,当存在其他属性时,必须加上“value=”。
> @MyAnno("zhangsan"):表示给value="zhangsan"赋值。
* 注解属性的类型
> 8种基本类型
> String类型
> 枚举类型
> Class类型
> 注解类型
> 以上类型的一维数组类型
> 定义:
@MyAnno1{
int a();
String b();
MyEnum c();
Class d();
MyAnno2 e();
String f();
}
> 使用:
@MyAnno1(
a=100,
b="zhangsan",
c=MyEnum.option,
d=String.class,
e=@MyAnno2(age=20,name="zhangsan"),
f={"123", "456"}
)
——注解的作用目标限定以及保存策略限定
1、目标限定
让一个注解的作用目标只能在类上,而不能在方法上,这就叫作用目标的限定。
在定义注解时,给注解添加注解,这个注解时@Target
Target注解有一个属性:ElementType[] value(),这个属性是一个枚举类型。
使用方法:
@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType/FIELD})
@interface MyAnno{ }
2、保留策略
* 源代码文件(SOURCE)
> 注解只在源代码中存在,当编译时就被忽略了(不能被反射)
* 字节码文件(CLASS)
> 注解在源代码中存在,编译时会把注解信息放到class文件中,但JVM在加载类时,会忽略注解。
* JVM中(RUNTIME)
> 注解在源代码、字节码文件中存在,并且在JVM加载类时,会把注解加载到JVM内存中(它是唯一可以反射的注解)
限定注解的保留策略:
使用RetentionPolicy注解:
@Retention(RetentionPolicy.RUNTIME)
——读取注解(反射)
1、要求:
注解的保留策略必须是RUNTIME
2、反射注解需要从作用目标上反射
* 类上的注解,需要使用Class来获取
* 方法上的注解,需要用Method来返回
* 构造器上的注解,需要用Constructor来获取
Class类方法概要:
<T extends Annotation> getAnnotation(Class<A> annotationClass)
如果存在该元素的指定类型的注解,则返回这些注解,否则返回null。
Annotation[] getAnnotations()
返回此元素上存在的所有注解。
Method、Field、Constructor:
这三个类都是AccessibleObject的子类。
AccessibleObject类方法概要:
<T extends Annotation> getAnnotation(Class<T> annotationClass)
如果存在该元素的指定类型的注解,则返回这些注解,否则返回null。
Annotation[] getAnnotations()
返回此元素上存在的所有注解。
Annotation[] getDeclaredAnnotations()
返回直接存在于此元素上的所有注解。
public Type getGenericSuperclass()
返回表示此Class所表示的实体(类、接口、基本类型或void)的直接父类的Type。
获取传递给父类的泛型信息。
返回的类型是Type接口的子接口:ParameterizedType(参数化类型) == A<String>
1、子类:得到当前类的Class对象:this.getClass()
2、Class:得到当前类父类的参数化类型(A<String, Integer...>):Type getGenericSuperclass(),因为返回值是ParameterizedType,所以需要强制类型转换。
3、ParameterizedType:得到所有的类型参数<String, Integer...>:Type[] getActualTypeArguments()
System.out.println(c3);
}
——反射泛型和反射注解的应用案例
User类:
}
Table注解:
----------------------------------------------------------------------------------------------------------------------------
ID注解:
----------------------------------------------------------------------------------------------------------------------------
Column注解:
BaseDAO:
-------------------------
-------------------------
// 可以将表名作为注解配置到类上,然后通过反射注解来获取配置的表名信息
-------------------------
}
JDK1.5新特性之注解的更多相关文章
- JDK1.7新特性(2):异常和可变长参数处理
异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- JDK1.8新特性之(三)--函数式接口
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- Python3新特性 类型注解 以及 点点点
Python3新特性 类型注解 以及 点点点 ... Python3 的新特性 Python 是一种动态语言,变量以及函数的参数是 不区分类型 的 在 函数中使用类型注解 相当于 给 形参的 类型 设 ...
- JDK1.8 新特性
jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
随机推荐
- StreamAPI
一.简介 Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作,或者大批量数据操作 . Stream API 借助于同样 ...
- 达梦数据库(DM8)大规模并行集群MPP 2节点安装部署
达梦数据库大规模并行集群MPP 2节点安装部署 1.环境准备 os 数据库版本 ip mpp角色 centos7.x86 DM8 192.168.30.100 mpp1 centos7.x86 ...
- [Vue warn]: Invalid prop: type check failed for prop "percentage". Expected Number, got Null
Vue组件报错 <ElProgress> at packages/progress/src/progress.vue 用了element组件 绑定数据时后端给我们传的参数为null,所以组 ...
- Qt+腾讯IM开发笔记(一):腾讯IM介绍、使用和Qt集成腾讯IM-SDK的工程模板Demo
前言 开发一个支持全国的IM聊天,可以有基本的功能,发送文本.图片.文件等等相关内容. 腾讯IM产品 概述 腾讯即时通信IM是腾讯推出的即时聊天程序,当前时间为2020年3月(腾讯IM的优 ...
- rsync(873)未授权访问
cd vulhub-master/rsync/common docker -composeup -d 检测 1.列出目标服务器的同步目录 rsync 192.168.244.129:: 2.查看模块文 ...
- 自学linux——19.TFTP服务器的搭建
TFTP服务器的搭建 1.TFTP的认识 TFTP(Trivial File Transfer Protocol)简单文件传输协议,是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议,不需 ...
- C++利用模板在Windows上快速调用DLL函数
更新日志 --------- 2021/08/01 更新V2.2 增加 GetHmodule 函数 - 允许用户获取HMODULE以验证加载DLL是否成功. 2021/08/03 更新V2.3 增加 ...
- 墙裂推荐!2020Android阿里&腾讯&百度&字节&美团校招面试汇总
基本情况 2021届硕士生,Android开发岗 此文主要是2020年年初春招实习的面试和正式校招面试经验汇总,最终校招拿到了腾讯,百度,美团等offer 主要包括阿里4面,腾讯实习4面和校招4面,字 ...
- 超详细 Java 15 新功能介绍
点赞再看,动力无限.微信搜「程序猿阿朗 」,认认真真写文章. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 15 在 2 ...
- Go连接到Linux服务器进行操作-执行shell命令&&上传文件
Go连接到Linux服务器进行操作 使用密码连接Linux服务器 package main import ( "fmt" "golang.org/x/crypto/ssh ...