Java学习系列(二十一)Java面向对象之注解详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45295947

一、前言

Java中的注解Annotation运用到很多方面,比如之前讲的单元测试中的@Test、Spring、SpringMVC还有其他框架等等。Java本身自带的注解也有一些,比如:@Override(子类要重写/覆写父类的对应方法)、@Deprecated(表示方法不建议被使用)、@SuppressWarnings(抑制警告)等等。当然,我们也可以自定义一些自己需要的注解(通常可以加在包,类,字段,方法,方法的参数以及局部变量上),这需要Java提供的四种元注解来负责完成我们的自定义注解功能。总体来说,注解比较还是简单的。下面先了解一下这四种元注解:

二、四种元注解(来源网络)

(一) @Target

@Target 表示该注解用于什么地方,可取的值包括:

ElemenetType.CONSTRUCTOR       构造器声明

ElemenetType.FIELD            字段声明(包括 enum 实例)

ElemenetType.LOCAL_VARIABLE     局部变量声明

ElemenetType.METHOD       方法声明

ElemenetType.PACKAGE            包声明

ElemenetType.PARAMETER       参数声明

ElemenetType.TYPE         类,接口(包括注解类型)或enum声明

ElementType.ANNOTATION_TYPE     注解

(二) @Retention

@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:

RetentionPolicy.SOURCE       注解将被编译器丢弃

RetentionPolicy.CLASS        注解在class文件中可用,但会被VM丢弃

RetentionPolicy.RUNTIME       JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

(三) @Documented

@Documented 将此注解包含在 javadoc 中

(四)@Inherited

@Inherited 允许子类继承父类中的注解

三、实例说明

1) 作用在类上的注解

// 编译器将把注解信息记录在class文件中,当运行Java程序时JVM会保留注解,因此可以通过反射机制来读取注解的信息。
@Retention(RetentionPolicy.RUNTIME)
// 注解作用在类上面
@Target(ElementType.TYPE)
public @interface ClassName {
	// 声明默认值
	String name() default "豆豆";

	// 特殊的值
	String value();
}

2) 作用在属性(字段)上的注解

@Retention(RetentionPolicy.RUNTIME)
// 注解作用在属性(字段)上
@Target(ElementType.FIELD)
public @interface FieldName {
	String value();
}

3)作用在方法上的注解

@Retention(RetentionPolicy.RUNTIME)
// 注释作用在方法上
@Target(ElementType.METHOD)
public @interface MethodName {
	String value();

	Class<?> type();
}

4)实例演示

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author [*昨日重现*] [email protected]
 * @since version 1.0
 * @datetime 2015年4月27日 上午12:57:03
 */

// 指定用的是哪个自定义注解的类,若把name去掉,则name默认为:豆豆
@ClassName(name = "实体", value = "用户")
public class User {
	@FieldName("姓名")
	private String name;
	@FieldName("性别")
	private String sex;

	public String getName() {
		return name;
	}

	@MethodName(type = java.lang.String.class, value = "王五")
	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	@MethodName(type = java.lang.String.class, value = "男")
	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", sex=" + sex + "]";
	}

	public static void main(String[] args) throws Exception {
		Class<?> c1 = Class.forName("com.leo.annotation.User");
		// Class<?> c1 = Student.class;

		// 一: 获取类上的注解信息
		// 如果该元素的指定注解类型的注解存在于此对象上,则返回这些注释,否则返回 null
		ClassName cn = c1.getAnnotation(ClassName.class);
		System.out.println(cn.name() + " ," + cn.value());
		System.out.println("\n=============================");

		// 二:获取属性(字段)上的注解信息
		Field f1 = c1.getDeclaredField("sex");
		f1.setAccessible(true);
		FieldName fn = f1.getAnnotation(FieldName.class);
		System.out.println(fn.value());

		// Field[] fields = c1.getDeclaredFields();
		// for (Field field : fields) {
		// field.setAccessible(true);
		// FieldName fn = field.getAnnotation(FieldName.class);
		// if (fn != null) {
		// System.out.println(fn.value());
		// }
		// }

		// 三:获取方法上的注解信息
		Method[] methods = c1.getDeclaredMethods();
		User obj = (User) c1.newInstance();
		for (Method method : methods) {
			System.out.println("方法名:" + method.getName());
			// 检查方法上面是否有Annotation
			MethodName mn = method.getAnnotation(MethodName.class);
			if (mn != null) {
				// 回调赋值。第一个参数为目标对象,第二个参数为被访问的方法实参
				method.invoke(obj, mn.value());
			}
		}
		System.out.println(obj.getName() + " ," + obj.getSex());
	}

}

四、总结

1)注意:注解不是注释。注解提供的是实现程序功能的重要组成部分,而注释提供代码功能的说明。

2)注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。

时间: 2024-08-03 15:22:58

Java学习系列(二十一)Java面向对象之注解详解的相关文章

Java学习系列(二十三)Java面向对象之内部类详解

一.前言 内部类也称寄生类,就是把一个类放在类里面(即内部类的上一级程序单元是类)定义,将其作为外部类的成员.内部类主要用几种定义形式:静态(static)内部类,非静态内部类,匿名内部类(也就是没有名字的寄生类).内部类的好处就是内部类可以直接外部类的(包括私有)成员,反之不能.下面我们通过一些实例来详细讲解一下Java中内部类的使用及几种定义形式的相互调用. 二.实例说明 (1)匿名内部类:当程序创建匿名内部类时,会立即创建匿名内部类(实现类)的实例. interface IBreathe

Java学习系列(二十)Java面向对象之反射详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45289391 前言 今天讲讲Java中的反射.我们常见的反射多用于JDBC中的加载驱动程序Class.forName("com.mysql.jdbc.Driver");.Struts的MVC.Hibernate中的ORM.Spring中的IOC还有一些其他框架等等.那它有什么好处呢?它的好处就是能够动态的创建对象和编译且能够访问某个类中的所有(包括私有)属性方法及对象的属性方法

Java学习系列(二十四)Java正则表达式详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45501777 前言 正则表达式可以说是用来处理字符串的一把利器,它是一个专门匹配n个字符串的字符串模板,本质是查找和替换.在实例演示之前先了解一下Pattern.Matcher这两个工具类,Pattern:编译好的带匹配的模板(如:Pattern.compile("[a-z]{2}");/ / 取2个小写字母):Matcher:匹配目标字符串后产生的结果(如:pattern.m

java学习系列1--初识java

1. java三大版本 Java se:java的标准版本,定位在客户端,主要用于桌面应用软件的变成 Java ee:企业级版本,定位在服务器端,主要用于分布式网络程序的开发,如电子商务网站 Java me:主要应用于嵌入式系统开发,如手机和PDA的编程 2. java特点 java是跨平台的:java程序的字节码文件可以在任何具有java虚拟机的计算机或者电子设备上运行,java虚拟机中的java解释器负责将字节码文件解释成为特定的机器码进行执行. java是简单的:没有#include和#d

java集合(二)List集合之Stack详解

Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out). java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表.当然,我们也可以将LinkedList当作栈来使用!在“Java 集合系列06之 Vector详细介绍(源码解析)和使用示例”中,已经详细介绍过Vector的数据结构,这里就不再对Stack的数据结构进行说明了. Stack的继承关系 java

java集合(二)List集合之Vector详解

简介Vector的内部实现类似于ArrayList,Vector也是基于一个容量能够动态增长的数组来实现的,该类是JDK1.0版本添加的类,它的很多实现方法都加入了同步语句,因此是线程安全的(但Vector其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全,我们后面会有例子来说明这一点). Vector类声明如下 public class Vector<E> extends AbstractList<E> implements List<E>, Random

大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用介绍.本文主要讲解如何搭建Hadoop+Hive的环境. 一.环境准备 1,服务器选择 本地虚拟机 操作系统:linux CentOS 7 Cpu:2核 内存:2G 硬盘:40G 说明:因为使用阿里云服务器每次都要重新配置,而且还要考虑网络传输问题,于是自己在本地便搭建了一个虚拟机,方便文件的传输以

Java学习系列(二十二)Java面向对象之枚举详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45332565 一.前言 今天我们来讲讲枚举,希望通过这篇博客大家能对枚举有个更全面的了解.枚举是一种实例(大写)数固定的类(不能再创建实例),多用于确定的状态数(如:鼠标上下左右.IM消息已读未读).类型数(如:系统.聊天.添加好友消息,我的他的).模式数(回复.评论模式,刷选.全部模式)等等.枚举和类一样,同样有抽象类.可以实现接口.可含内部类.初始化块,值得注意的是:枚举的构造器无论

java集合(二)List集合之ArrayList详解

前言: 有序列表,允许存放重复的元素:实现类: ArrayList:数组实现,查询快,增删慢,轻量级:(线程不安全) LinkedList:双向链表实现,增删快,查询慢 (线程不安全) Vector:数组实现,重量级 (线程安全.使用少) Stack:对象栈,遵循先进后出的原则. 一.ArrayList简介 ArrayList 是 java 集合框架中比较常用的数据结构了.继承自 AbstractList,实现了 List 接口.底层基于数组实现容量大小动态变化.允许 null 的存在.同时还实