`

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源代码中不但可以包含功能性的实现代码,还可以添加元数据。

 

分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化详解.zip

    通过阅读《精通Hibernate:Java对象持久化详解》,开发者可以深入了解Hibernate的工作原理,学习如何有效地使用它来实现对象持久化,从而提高开发效率,降低维护成本。这本书对于Java Web开发者,尤其是初次接触...

    Java2编程详解(Special_Edition_Using_Java)

    其次,书中会深入探讨面向对象编程(OOP)的概念,这是Java语言的核心特性。OOP涉及类的继承、封装和多态性,通过实例解释如何设计和实现复杂的系统。此外,还会讲解如何使用异常处理来增强代码的健壮性,以及如何...

    java2编程详解 java学习

    Java2编程详解主要涵盖Java语言的核心概念和技术,包括但不限于语法基础、面向对象编程、类与对象、接口与抽象类、异常处理、输入/输出(I/O)系统、集合框架、多线程、网络编程以及Java的高级特性。以下是对这些主题...

    Java2编程详解

    2. **面向对象编程**:Java是完全面向对象的语言,它支持类、对象、封装、继承、多态等面向对象特性。理解类和对象的概念,学会如何设计和实现类,以及掌握继承和多态的应用,对于编写可维护、可扩展的代码至关重要...

    java2编程详解(special_edition_using_java)

    2. **类与对象**:阐述面向对象编程的基本原理,包括类的定义、对象的创建与销毁、封装、继承和多态等概念。 3. **数组与集合框架**:介绍如何使用数组存储和操作数据,并深入探讨Java的集合框架,如ArrayList、...

    李兴华系列–JAVA详解视频教程

    根据提供的文件信息,“李兴华系列–JAVA详解视频教程”,我们可以从中提炼出一系列与Java编程语言相关的知识点。尽管部分内容提供了一个百度网盘链接但未给出具体教程内容,这里将基于标题、描述和标签来展开讨论...

    Java学习路线jid

    学习面向对象编程可以通过阅读 Java 编程语言的教材或者在线教程来学习。 Java API Java API 是 Java 编程的核心。它包含了大量的类和接口,提供了丰富的功能和工具。学习 Java API 需要熟悉 Java 的各种类和接口的...

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

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

    Java开发详解视频教程(孙鑫)9a

    2. **面向对象编程**:作为一门面向对象的语言,Java的类、对象、封装、继承和多态性是重点。教程可能详细解释如何创建类,以及如何通过对象来操作数据。同时,讲解如何利用继承和多态性实现代码的复用和灵活性。 3...

    java基础-java多态详解

    多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 多态的体现 多态性可以通过接口和实现接口、父类和继承父类、覆盖父类中同一个方法的几个不同类来体现。例如,在 Java 中,我们...

    面向对象软件的测试详解PPT

    在实际操作中,Junit是一个广泛使用的开源Java测试框架,用于编写和运行面向对象软件的单元测试。通过Junit,开发者可以轻松创建测试用例,执行测试,并获取详细的测试报告。安装Junit通常涉及添加依赖到项目构建...

    hibernate:java持久化对象详解02

    在Java编程领域,Hibernate是一个非常重要的框架,它用于简化数据库操作,实现了对象关系映射(ORM),使得开发者可以用面向对象的方式来处理数据。本教程“hibernate:java持久化对象详解02”是系列教程的一部分,它...

    高清java学习资源

    【Java学习资源详解】 在Java学习的道路上,拥有高质量的学习资源是至关重要的。"高清Java学习资源"这一压缩包提供了一份珍贵的资料——"javase35天笔记.pdf",它是一个详细的Java基础教程,旨在帮助初学者系统、...

    java面向对象面试题

    ### Java面向对象面试题知识点详解 #### 一、Java概述 - **发展历程**:Java语言始于1991年Sun公司的James Gosling等人所开发的Oak语言,原计划用于控制嵌入式设备如电视遥控器等。随着互联网的发展,Oak在1994年...

    JAVA SE内容详解

    05_面向对象基础篇.doc讲解了Java的面向对象特性,包括类、对象、继承、封装、多态等概念。在Java中,一切皆为对象,理解面向对象编程有助于构建复杂系统的模块化结构。 3. **数据结构** 04_Java数据结构.doc介绍...

    Java学习路线,Android学习路线,Java全套路线视频下载连接

    ### Java学习路线与Android学习路线详解 #### 一、Java学习路线概述 Java作为一种广泛使用的编程语言,在软件开发领域有着举足轻重的地位。对于初学者来说,掌握正确的学习路径至关重要。以下是一份详细的Java学习...

    JAVA编程实例大全及详解答案(50例)

    1. **面向对象编程**:Java的核心特性之一是面向对象,这包括类、对象、封装、继承和多态等概念。实例可能涵盖创建类,定义对象,以及如何通过继承和多态性来扩展类的功能。 2. **基本数据类型与变量**:Java有八种...

    JAVA2编程详解(pdg格式)

    Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems(现为Oracle公司)于1995年推出。它的设计目标是“一次编写,到处运行”,这意味着用Java编写的代码可以在任何支持Java的设备上运行,无需重新编译。这...

    新手学习Java路线图

    ** 这一部分的学习主要聚焦于理解Java的基本语法、面向对象编程的思想以及常用的API。 1. **Java语法** - 学习Java的基础语法包括变量、数据类型、运算符、控制流程等。 - 掌握类和对象的概念,理解如何声明类、...

    java基础核心学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。Java的设计目标是具有高度的可移植性、安全性以及健壮性,这使得它成为开发跨平台应用程序的理想选择。Java的基础核心...

Global site tag (gtag.js) - Google Analytics