Java之注解初探

1. 什么是注解(Annotation)

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

注意:Annotation是个接口,程序能够经过反射来获取指定的程序元素的Anotation对象,而后经过Annotation对象来得到注解里面的元数据。Annotation有时是指java.lang.Annotation,有时指注解自己。程序员

2. 系统定义的三个Annotation

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

@Override工具

它的做用是对覆盖超类中方法的方法进行标记,若是被标记的方法并无实际覆盖超类中的方法,则编译器会发出错误警告。开发工具

@Deprecated测试

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

@SuppressWarningscode

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

其参数有:
接口

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);
	}

}
相关文章
相关标签/搜索