`

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会保留注解,因此可以通过<a target=_blank href="http://blog.csdn.net/lhy_ycu/article/details/45289391">反射</a>机制来读取注解的信息。
@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 [*昨日重现*] lhy_ycu@163.com
 * @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源代码中不但可以包含功能性的实现代码,还可以添加元数据。

 

分享到:
评论

相关推荐

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 ...

    Java工程师面试复习指南

    面向对象基础 Java基本数据类型 字符串和包装类 关键字最终特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举...

    java基础.txt 百度云

    Java 面向对象 深入面向对象和数组 Java 常用类详解 Java 异常机制解析 Java 集合与数据结构 JavaIO 流全解析 深入理解 Java 多线程 Java 网络编程 手动开发一个 Web 服务器 深入理解 Java 注解+反射 Java...

    springboot注解详解.pdf

    使用注解的优势有采用纯java代码,不在需要配置繁杂的xml文件,在配置中也可享受面向对象带来的好处.类型安全对重构可以提供良好的支持.减少复杂配置文件的同时亦能享受到springIoC容器提供的功能

    JAVA SE内容详解

    JAVA SE内容详解,包含数组,数据结构,面向对象,异常处理,注解,泛型,集合,类加载,反射,多线程,IO,网络编程

    java基础案例与开发详解案例源码全

    7.1 面向对象的分析与设计简介180 7.1.1 类的设计建议180 7.1.2 类名.变量名.方法名的选取181 7.1.3 类的属性设计建议182 7.1.4 类的方法设计建议182 7.1.5 继承的设计建议182 7.2 对象模型建立183 7.2.1 UML简介183...

    Java 基础核心总结 +经典算法大全.rar

    continue 语句面向对象 类也是-种对象对象的创建 属性和方法 构造方法 方法重载 方法的重写 初始化 类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java基础:Java概念、基础语法、面向对象的理解、String类、Object类、序列化、泛型、注解与反射、JDK1.8新特性等;Java集合:List底层实现、Map底层实现等;Java并发编程:ThreadLocal、Java内存模型、锁、并发工具...

    Java基础最全笔记文档

    7. 面向对象基础 8. 常用API 9. 综合项目实战 Java加强篇包括: 1. static、单例设计、继承 2. 权限修饰符、常量、枚举、抽象类 3. 多态、内部类、常用API 4. 日期与时间、日期类、包装类、正则表达式、Arrays 类、...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    价值上万的视频教程互联网程序开发+大数据+Hadoop、hive、Spark

    · 面向对象编程 · 模式匹配 · 高阶函数 · 特质 · 注解&类型参数 · 隐式转换 · 高级类型 · 案例实操 Spark Core · 安装部署 · RDD概述 · 编程模型 · 持久化&检查点机制 · DAG · 算子详解 ...

    Hibernate实战(第2版 中文高清版)

     1.1.4 面向对象应用程序中的持久化   1.2 范式不匹配   1.2.1 粒度问题   1.2.2 子类型问题   1.2.3 同一性问题   1.2.4 与关联相关的问题   1.2.5 数据导航的问题   1.2.6 不匹配的代价   1.3 ...

    Scala程序设计(第2版)

    8.8 调用父类构造器(与良好的面向对象设计) 226 8.9 嵌套类型 230 8.10 本章回顾与下一章提要 232 第9章 特征 233 9.1 Java 8中的接口 233 9.2 混入trait 234 9.3 可堆叠的特征 238 9.4 ...

    Spring中文帮助文档

    11.6. 用Java对象来表达JDBC操作 11.6.1. SqlQuery类 11.6.2. MappingSqlQuery类 11.6.3. SqlUpdate类 11.6.4. StoredProcedure类 11.6.5. SqlFunction类 11.7. 参数和数据处理的基本原则 11.7.1. 为参数设置...

    Spring API

    11.6. 用Java对象来表达JDBC操作 11.6.1. SqlQuery类 11.6.2. MappingSqlQuery类 11.6.3. SqlUpdate类 11.6.4. StoredProcedure类 11.6.5. SqlFunction类 11.7. 参数和数据处理的基本原则 11.7.1. 为参数设置...

    Spring 2.0 开发参考手册

    11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate ...

    spring chm文档

    11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. ...

Global site tag (gtag.js) - Google Analytics