文档章节

Java之注解初探

来来来过来挨到我坐
 来来来过来挨到我坐
发布于 2016/01/28 11:30
字数 862
阅读 10
收藏 0

1. 什么是注解(Annotation)

    JDK1.5开始,Java增加了对元数据(即类的组成单元数据)的支持,也就是注解(Annotation),他是代码里做的特殊标记,这些标记可以在编译、类加载、运行时在不改变原有逻辑的情况下被读取,并执行相应的处理,通过使用Annotation,程序员可以在原文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。Annotation类似于修饰符一样被使用,可以用于包、类、构造方法、方法、成员变量、参数、局部变量的声明。

注意:Annotation是个接口,程序可以通过反射来获取指定的程序元素的Anotation对象,然后通过Annotation对象来获得注解里面的元数据。Annotation有时是指java.lang.Annotation,有时指注解本身。

2. 系统定义的三个Annotation

在JDK1.5之后,在系统中提供了三个Annotation,分别是:@Override、@Deprecated、@SuppressWarnings

@Override

它的作用是对覆盖超类中方法的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。

@Deprecated

表示这一个类或方法已过时,不再建议继续使用了。

@SuppressWarnings

表示关闭不当的编译器警告信息。

其参数有:

deprecation,使用了过时的类或方法时的警告

unchecked,执行了未检查的转换时的警告

fallthrough,当Switch程序块直接通往下一种情况而没有break时的警告

path,在类路径、源文件路径等中有不存在的路径时的警告

finally,任何finally子句不能正常完成时的警告

all,关于以上所有情况的警告

下面看一个小例子:

package com.main;

public class Person {

	@Override
	public String toString() {
		return "测试@Override";
	}

	@Deprecated
	public void print() {
		System.out.println("测试@Deprecated");
	}

}

3. 自定义Annotation

注解应用需要三个步骤:

  1. 编写注释

  2. 在类上应用注释

  3. 对应用了注释的类进行反射操作的类

    自定义Annotation的语法如下:

    访问控制权限 @interface Annotation名称{}

    例如:

    public @interface MyAnnotation{}

package com.main;

/**
 * 自定义注解
 * @author lenovo
 */
public @interface MyAnnotation {
	// 定义变量
	public String name();
	public int age();
	public String info() default "学生";// 为变量info设置默认值
}
package com.main;

@MyAnnotation(age = 18, name = "小明")
public class Person {

4. Retention和RetentionPolicy

Annotation要想决定其作用的范围,可以通过@Retention指定,而Retention指定的范围由RetentionPolicy决定,RetentionPolicy指定了三种范围:

范围 描述
public static final RetentionPolicy SOURCE 在java源程序中存在
public static final RetentionPolicy CLASS 在java生成的class中存在
public static final RetentionPolicy RUNTIME 在java运行的时候存在

示例:

package com.main;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 自定义注解
 * @author lenovo
 */
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	// 定义变量
	public String name();
	public int age();
	public String info() default "学生";// 为变量info设置默认值
}

5. 反射与Annotation

一个Annotation真正起作用,必须结合反射机制,在反射中提供了以下的操作方法:

java.lang.reflect.AccessibleObject

方法名称 描述
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 判断是否是指定的Annotation
public Annotation[] getAnnotations()
得到全部的Annotation

实例:

package com.main;

import java.lang.annotation.Annotation;

public class AnnotationTest {
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Class personClass = Person.class;
		Annotation annotation = personClass.getAnnotation(MyAnnotation.class);
		MyAnnotation myAnnotation = (MyAnnotation) annotation;
		String name = myAnnotation.name();
		int age = myAnnotation.age();

		Person p1 = (Person) personClass.newInstance();
		p1.setName(name);
		p1.setAge(age);
		
		System.out.println(p1);
	}

}


© 著作权归作者所有

共有 人打赏支持
来来来过来挨到我坐
粉丝 2
博文 13
码字总数 7493
作品 0
程序员
Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getCon...

rockypeng
2014/01/19
0
0
JVM初探- 使用堆外内存减少Full GC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanqing280441589/article/details/54406665 JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流...

菜鸟-翡青
2017/01/13
0
0
初探Kotlin+SpringBoot联合编程

Kotlin是一门最近比较流行的静态类型编程语言,而且和Groovy、Scala一样同属Java系。Kotlin具有的很多静态语言特性诸如:类型判断、多范式、扩展函数、模式匹配等等让我无法只作为一个吃瓜群...

CodeSheep
01/23
0
4
Java注解教程:自定义注解示例,利用反射进行解析

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

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

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

王木东
04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
14分钟前
2
0
springboot logback日志配置

springboot 如果不使用外部tomcat的话,日志是需要自己配置的,不然的话就只有控制台的日志,但是日志又是我们在项目上了生产环境,出问题时,检查问题的唯一途径,所以我们要配置详细的日志...

曾大大胖
14分钟前
2
0
Linux服务器集体篡改时间的方法

Red Hat 虚拟化课程RH318,中小型公司使用的话,感觉可以匹敌OpenStack。手头上有一个VMware的映像,RHEV 3.5版的,只能把系统时间调整到2016年才能使用。Red Hat的RHEV已经更新到4.1版,不过...

大别阿郎
15分钟前
1
0
Tomcat启动异常:java.lang.ClassNotFoundException

警告: Name = mysqlDataSource Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, wh......

hengbao5
16分钟前
1
0
GO错误的一些处理(defer,recover,panic)

package main import("fmt""errors")func main() {num := 10fmt.Printf("num的类型%T, num的值%v, num的地址%v\n", num, num, &num)num2 := new(int) //返回一个指针//num...

汤汤圆圆
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部