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 ...
随机推荐
- JDBC连接流程
ConectionFactory cf = new ConectionFactory();//创建数据库连接Connection con = cf.getConection();//打开水数据库的连接 ...
- python基础问题
包安装相关问:如何安装Python三方包?在命令行如何检查一个包是否已安装?答:安装用pip install 卸载用 pip uninstall 直接import 这个包问:环境变量PATH的作用是什 ...
- javascript学习--(四)面向对象:
一.生成器generator: javascript里的generator函数是用function*定义的, 案例:yield 也会返回 function* foo(x){ yield x+1; yi ...
- python里面的==,is的区别
python中对象的三个要素:id(身份标示),type(数据类型).value(值) == 比较操作符:用来比较两个对象值是否相等. is 同一性运算符:比较两个对象的id值是否相等,即是否是同 ...
- 在Windows7/8/10 64位操作系统下安装并注册ocx控件
例如: 先网上下载一个MtbLine.ocx控件放入C:\Windows\SysWOW64\目录下 1.首先确保你的 Windows7 账户是管理员权限 2.下载MtbLine.ocx控件,网上可搜到 ...
- DNS的原理和解析过程
DNS的解析原理和过程: 在Internet上域名和IP是对应的,DNS解析有两种:一种是正向解析,另外一种是反向解析. 正向解析:正向解析就是将域名转换成对应的 IP地址的过程,它应用于在浏览器地址 ...
- JVM参数模版
首先需要自己根据机器的配置设置JVM中各区域的初步大小,如下: -Xms4096M-Xmx4096M-Xmn3072M-Xss1M-XX:MetaspaceSize=256M-XX:MaxMetasp ...
- Bugku-misc 1-8题总结
1.签到题 略过 2.这是一张单纯的图片 拉入winhex,在最后面有一段Uniocde编码,解码得到flag. 3.隐写 题目是隐写,binwalk打开分析 得到两个Zlib(提供数据压缩用的函式库 ...
- XV6学习笔记(1) : 启动与加载
XV6学习笔记(1) 1. 启动与加载 首先我们先来分析pc的启动.其实这个都是老生常谈了,但是还是很重要的(也不知道面试官考不考这玩意), 1. 启动的第一件事-bios 首先启动的第一件事就是运行 ...
- Docker部署netcore web实践
1. 新建一个netcore的项目 2. 我们到项目的生成输出目录下,创建一个Dockerfile文件 3. 编辑Dockerfile文件 备注:红线圈住的地方,就是你生成的netcore的程序名称 ...