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 ...
随机推荐
- Servlet 单例多线程详解(六)
一.Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
- Windows10 64位解决无法使用Microsoft.Jet.OLEDB.4.0的方法
本机软件环境:Windows10 64位+Office2003 (32位) ============================================= 1.下载 ACE2010的驱动, ...
- 添加底部导航栏tabbar
效果图: 如果要添加底部导航栏,最少2个,最多5个. app.json { "pages": [ "pages/index/index", "page ...
- JVM参数模版
首先需要自己根据机器的配置设置JVM中各区域的初步大小,如下: -Xms4096M-Xmx4096M-Xmn3072M-Xss1M-XX:MetaspaceSize=256M-XX:MaxMetasp ...
- homeless靶机
仅供个人娱乐 靶机信息 下载地址:https://www.vulnhub.com/entry/homeless-1,215/ 一.主机扫描 二.信息收集 在网页源码和页面上,我们发现User-Agen ...
- anyRTC iOS端屏幕录制开发指南
一. 概述 实现直播过程中共享屏幕分为两个步骤:屏幕数据采集和流媒体数据推送.前对于 iOS 来说,屏幕采集需要系统的权限,受制于iOS系统的限制,第三方 app 并没有直接录制屏幕的权限,必须通过系 ...
- Python小白的数学建模课-10.微分方程边值问题
小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型边值问题的建模与求解,不涉及算法推导和编程,只探讨如何使用 Pytho ...
- Blazor 路由及导航开发指南
翻译自 Waqas Anwar 2021年4月2日的文章 <A Developer's Guide To Blazor Routing and Navigation> [1] 检查传入的请 ...
- 攻防世界pwn高手区——pwn1
攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...
- C++ 继承方式 与 普通方式 对比
1 //C++ 继承 2 //继承是面向对象三大特性之一 3 4 #include <iostream> 5 #include <string> 6 using namespa ...