文档章节

java --注解

求是科技
 求是科技
发布于 2016/09/25 22:14
字数 1326
阅读 32
收藏 1

#1.什么是注解?
注解也叫元数据(用来描述数据的数据),它用来对某些元素进行说明/注释等。
注解是一个接口,程序可以通过反射来获取指定元素的Annotaion,然后通过Annotation对象来获取注解里面的元数据。
#2.注解的所用?
2.1 创建文档,通过在代码里标识注解生成[doc文档]。
2.2 跟踪代码的依赖性,配置依赖信息可以使用xml文档与注解两种形式 。
2.3 执行编译时检查,如@override放在方法前,如果这个方法不是重写父类的方法,则编译报错。
#3.注解的分类
3.1 标记注解,Annotation类型没有成员变量,例如Override。
3.2 单值注解。
3.3 完整注解。
#4.注解的分类
4.1 jdk自带注解
@Override:重写父类中方法。
@Deprecated:表明该类、方法不建议使用。
@SuppressWarnings:忽略警告。
4.2 元注解
4.3 自定义注解
#5.java提供的注解
@Target、@Retention、@Documented、@Inherited
5.1 @Target
@Target说明了Annotation修饰对象的范围,Annotaion可以用于packages、types(类、接口、枚举、Annotation类型)、types成员(方法、构造方法、成员变量、枚举值)。
作用:描述该注解使用的范围
取值(ElementType)有:
1.TYPE:类、接口(包括注解)、枚举声明
2.FIELD:域变量(包括枚举常量)
3.METHOD:方法
4.PARAMETER:描述参数
5.CONSTRUCTOR:构造器
6.LOCAL_VARIABLE:局部变量
7.ANNOTATION_TYPE:注解类型
8.PACKAGE:包
举例

@Target(ElementType.METHOD)
public @interface Override {
}

说明:Override这个注解只能用于方法上面。
5.2 @Retention
@Retention定义了该注释保留多长时间,默认是RetentionPolicy.CLASS,即在class文件中有效。
作用:描述该注解的生命周期
取值(RetentionPolicy)有:
1.SOURCE:在源文件中有效,编译时被丢弃
2.CLASS:在类文件中有效,编译时被记录,在运行时被丢弃
3.RUNTIME:在运行时有效
举例

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
	public String name() default "fieldName";
}

说明:Column注解可用于变量上面,在运行时有效。Column注解的属性值是运行时,因此这样的注解可以通过反射获取到该注解的属性值。
5.3 @Documented
作用:生成javadoc文档,@Documented注解是一个标记注解,没有成员。
5.4 @Inherited
@Inherited是一个标记注解,@Inherited表示它修饰的对象类型是可以被继承的。
#6.自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口。在自定义注解时,不能继承其它的注解或接口。@interface用来申明一个注解,其中每一个方法实际上是声明了一个配置参数。方法的名称就是参数参数的名称,返回值类型就是参数类型。
如下是自定义注解
1.水果名称注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitType {
	String value() default "";
}

2.水果颜色注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
	enum Color{BULE,RED,GREEN;}
	
	Color fruitColor() default Color.BULE;
}

3.水果提供商注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {

	//供应商编号
	public int id() default 1;
	//供应商名称
	public String name() default "";
	//供应商地址
	public String address() default "";
}

#7.注解处理器
定义了注解,如果不使用,那也没用。
使用注解,必须创建注解处理器,java中利用反射机制,可以帮我们构造注解处理器。
java使用Annotation接口来表示程序元素前面的注解,java在reflect包下新增了AnnotatedElement接口,该接口可以接受注解的程序元素,该接口主要的实现类
Class、Constructor、Field(类的成员变量)、Method、Package
java.lang.reflect包下主要是一些实现反射功能的工具类,该包提供了反射api来读取运行时Annotation信息。
AnnotatedElement接口是所有程序元素(Class、Constructor、Field(类的成员变量)、Method、Package)的父接口,所以程序通过反射获取了整个类的AnnotatedElement对象之后,程序就可以调用该对象如下四个方法来访问Annotation信息:
getAnnotation(Class<T> annotationClass):返回程序元素上指定类型的注解,如果注解不存在,则返回null
getAnnotations:返回程序元素上所有的注解
getDeclaredAnnotations:返回程序元素上所有的注解,忽略父级注解
isAnnotationPresent(Class<? extends Annotation> annotationClass):判断程序元素上是否包含指定类型的注解(@Target、@Retention、@Documented、@Inherited ),存在则返回true,否则返回false。 注解处理器如下

/**
 * 注解处理器
 */
public class FruitUtil {
	
	public static void getFruitUtil(Class<?> clazz)
	{
		//定义变量
		String strFruitName = "水果名称:";
		String strFruitColor = "水果颜色:";
		String strFruitProvider = "供应商信息:";
		
		//getDeclaredFields:获取clazz类里面所有的属性
		Field[] fields = clazz.getDeclaredFields();
		
		//循环注解
		for(Field field:fields)
		{
			//如果FruitType上包含注解
			if (field.isAnnotationPresent(FruitType.class)) {
				//获取该程序元素
				FruitType fruitName = (FruitType)field.getAnnotation(FruitType.class);
				//获取该程序元素的注解值
				strFruitName = strFruitName+fruitName.value();
				//打印注解值
				//备注:实际工程中,这里根据拿到的注解值做相关的业务
				System.out.println(strFruitName);
			}else if (field.isAnnotationPresent(FruitColor.class)) {
				FruitColor fruitColor = (FruitColor)field.getAnnotation(FruitColor.class);
				strFruitColor = strFruitColor+fruitColor.fruitColor();
				System.out.println(strFruitColor);
			}else if (field.isAnnotationPresent(FruitProvider.class)) {
				FruitProvider fruitProvider = (FruitProvider)field.getAnnotation(FruitProvider.class);
				strFruitProvider = strFruitProvider+"供应商编号:"+
											fruitProvider.id()+";"+
											"供应商名称"+
											fruitProvider.name()+";"+
											"供应商地址"+
											fruitProvider.address();
				System.out.println(strFruitProvider);
			}
		}
	}
}

采用如上方法拿到了注解值,然后可以做相关的处理操作。但是相关的操作,不能影响主业务。

© 著作权归作者所有

上一篇: java --file
下一篇: java --枚举
求是科技

求是科技

粉丝 100
博文 455
码字总数 238876
作品 0
成都
后端工程师
私信 提问
spring application 之 AnnotationConfigApplicationContext

创建 AnnotationConfigApplicationContext 构造方法 AnnotatedBean读取 Contional 条件注解解析类,是否需要忽略当前类 默认注解配置处理器 排序注解器 依赖解决处理器 处理@Lazy @Value @Qua...

my_juke
06/09
50
0
JAXB Annotation初步使用

JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式。JAXB提供两种主要特性:将一个Java对象序列化为XML,以及反向操作,将XML解析成Java对象。换...

秋风醉了
2014/07/02
361
0
Spring Boot实战之基础回顾

本文作者: 吴伟祥 本文链接: https://wuweixiang.cn/2018/08/21/Spring-Boot实战之基础回顾/ 版权声明: 本博客所有文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议。转载请在文章开...

吴伟祥
2018/08/21
68
0
Java注解教程:自定义注解示例,利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响。在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解。 注解是Java ...

哲别0
2017/10/23
65
0
Kotlin和Java混合开发必读:基本的互操作

在使用Kotlin和Java混合开发的时候,涉及到一些基本的互操作 一、属性的读写 1.Kotlin自动识别Java的属性的Getter和Setter 2.Java操作kotlin属性可以通过Getter和Setter的方式 二、空安全类型...

王木东
2018/04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部