java学习笔记11--Annotation
java学习笔记11--Annotation
Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息。
java.lang.annotation Annotation接口是所有的Annotation都必须实现的接口。
系统内建的Annotation
在JDK1.5之后,系统中已经建立了如下的三个内建的Annotation类型,用户直接使用即可。
@Override:覆写的Annotation
@Deprecated:不赞成使用的Annotation
@SuppressWarnings:压制安全警告的Annotation
自定义Annotation
Annotation定义格式:
【public】 @interface Annotation名称{
数据类型 变量名称();
}
- public @interface Meaning {
- String value();
- }
之后就直接可以在程序中使用@Meaning的格式
- @Meaning(value="itmyhome")
- class Demo{
- }
可以在Annotation中设置一个参数,用来接收变量的内容,如上面的value,使用Annotation的时候也必须给参数赋值如:value="itmyhome"
既然可以设置一个参数,则同时也就可以设置多个参数。
- public @interface Meaning {
- String key();
- String value();
- }
此Annotation在使用的时候 需要设置两个参数,一个key一个value
- @Meaning(key="hi",value="itmyhome")
- class Demo{
- }
也可以设置一个数组进去
- public @interface Meaning {
- String[] value();
- }
接收的内容要传递数组
- @Meaning(value={"hello","world"})
- class Demo{
- }
以上所定义的全部的Annotation中有一个特点,所有的参数内容需要在使用注释的时候设置上去,那么也可以为一个参数设置默认的内容,在声明的时候使用default即可。
- public @interface Meaning {
- String value() default ""; //默认为空
- }
在使用的时候就可以不设置值
- @Meaning
- class Demo{
- }
在操作中,对于一个Annotation而言有时候会固定期取值范围,只能取固定的几个值,这个时候实际上就需要依靠枚举。
- public enum FormItemType { //定义枚举类型
- hidden,text,select,date
- }
定义Annotation
- public @interface Meaning {
- FormItemType value() ; //设置为枚举类型
- }
Annotation的取值只能是枚举类型中的值
- @Meaning(value=FormItemType.date)
- class Demo{
- }
Retention和RetentionPolicy
在Annotation中,可以使用Retention定义个Annotation的保存范围,此Annotation的定义如下:
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.FIELD)
- public @interface Meaning {
- FormItemType value() ; //设置为枚举类型
- }
在以上的Retetion定义中存在了一个RetentionPolicy的变量,此变量用于指定Annotation的保存范围,RetentionPolicy包含三种范围
在三个范围中,最重要的就是RUNTIME范围,因为在执行的时候起作用。
内建Annotation的RetentionPolicy
三个内建的Annotation的定义:
Override定义采用的是@Retention(RetentionPolicy.SOURCE) 只能在源文件中出现
Deprecated定义采用的是@Retention(RetentionPolicy.RUNTIME),可以在执行时出现
SuppressWarnings定义采用的是@Retention(RetentionPolicy.SOURCE),只能在源文件中出现
一个Annotation如果要是想让其变得有意义,则必须结合反射机制取得Annotaion中设置的全部内容。
在Class类中存在以下几种与Annotation操作有关的方法
- package com.itmyhome;
- import java.lang.annotation.Annotation;
- import java.lang.reflect.Method;
- class Demo{
- @SuppressWarnings("unchecked")
- @Deprecated
- @Override
- public String toString(){
- return "hello";
- }
- }
- public class T {
- public static void main(String[] args) throws Exception{
- Class<?> c = Class.forName("com.itmyhome.Demo");
- Method mt = c.getMethod("toString"); //找到toString方法
- Annotation an[] = mt.getAnnotations(); //取得全部的Annotation
- for(Annotation a:an){
- System.out.println(a);
- }
- }
- }
此时已经取得了一个Annota。以上的操作实际上是通过三个系统内建的Annotation完成的,也可以自定义一个Annotation
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface Meaning {
- FormItemType value() ; //设置为枚举类型
- }
- package com.itmyhome;
- import java.lang.reflect.Method;
- class Demo{
- @Meaning(value=FormItemType.select) //自定义Annotation
- @SuppressWarnings("unchecked")
- @Deprecated
- @Override
- public String toString(){
- return "hello";
- }
- }
- public class T {
- public static void main(String[] args) throws Exception{
- Class<?> c = Class.forName("com.itmyhome.Demo");
- Method mt = c.getMethod("toString"); //找到toString方法
- //指定的注释是否存在于此元素上
- if(mt.isAnnotationPresent(Meaning.class)){
- Meaning m = mt.getAnnotation(Meaning.class); //得到指定的Annotation
- System.out.println(m.value()); //取得Annotation的值
- }
- }
- }
@Target
指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制,如:@Target(ElementType.ANNOTATION_TYPE)
ElementType的保存范围
java学习笔记11--Annotation的更多相关文章
- Java学习笔记11
package welcome; import java.util.Scanner; /* * 代数问题:求解2x2线性方程 */ public class ComputeLinearEquation ...
- Java学习笔记 11/15:一个简单的JAVA例子
首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java // TestJava.java,java 的简单范例 public ...
- Java 学习笔记(11)——异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...
- java学习笔记(11) —— Struts2与Spring的整合
1.右键 项目名称 —— MyEclipse —— Add Spring Capabilities 2.选取 Copy checked Library contents to project fold ...
- Java学习笔记11(面向对象四:多态)
多态: 举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person 多态体现为:父类引用变量可以指向子类对象 多态的前提:必须有子 ...
- Java学习笔记-11.运行期间类型鉴定
1.Class对象的getClasses()方法获取的是该类中所有的公共的内部类,以及从父类,父接口继承来的内部类.getinterfaces()方法返回类继承的所有接口. import javax. ...
- Java 学习笔记(11)——lambda 表达式
在写Java代码的时候,如果某个地方需要一个接口的实现类,一般的做法是新定义一个实现类,并重写接口中的方法,在需要使用的时候new一个实现类对象使用,为了一个简单的接口或者说为了一个回调函数就得额外编 ...
- Java 学习笔记(11)——多线程
Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...
- Java学习笔记11(this,super)
this在构造方法间的使用, public class Person { private String name; private int age; public Person() { //this( ...
随机推荐
- CSharp Algorithm - Replace multiplication operator with a method
/* Author: Jiangong SUN */ How to replace multiplication operation with a method? For example, you h ...
- UITableViewHeaderFooterView的使用+自己主动布局
UITableViewHeaderFooterView的使用+自己主动布局 使用UITableView的header或footer复用时,假设採用自己主动布局,你会发现有约束冲突,以下这样写能够消除约 ...
- [Android系列—] 1. Android 开发环境搭建与Hello World
前言 開始之前先熟悉几个名词: SDK -- Software Development Kit, 软件开发工具包.这个词并不陌生, JDK,就是Jave Development Kit,相同对于And ...
- android Activity之间数据传递 Parcelable和Serializable接口的使用
Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...
- java-多线程安全问题
1. 安全问题产生原因 多个线程操作共享数据. 操作共享数据的线程代码有多条.当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了计算,就会产生线程安全问题. 2. 解决方案 java中用同步 ...
- linux脚本:shell, 判断输入参数的个数(命令行)
if [ $# != 3 ] ; thenecho "USAGE: $0 from to"echo " e.g.: $0 ~/oucaijun/from ~/oucaij ...
- Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary lo
mysql> show slave status\G *************************** 1. row *************************** ...
- N-Queens And N-Queens II [LeetCode] + Generate Parentheses[LeetCode] + 回溯法
回溯法 百度百科:回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步又一次选择,这样的走不通就退回再走的技术为回溯法 ...
- Linux教程:如何在Linux下进行C++开发?
Linux是一类Unix计算机操作系统的统称,Linux操作系统的内核的名字也是“Linux”, 在Linux下进行C++开发,需要注意许多问题,比如:减少不必要的编辑动作,减少编辑的时间. Wind ...
- [积累]C++复习 海大2014硕士生面试题微信系统总结
好久没用C++了,正好同学有个面试题,于是就帮忙看了一下.尽管对C++的知识了解不少, 可是长期被Java浸淫, 发现这个简单的程序却也写着也不是那么顺手.好在最后还是搞定了,以下分析一下,题目例如以 ...