Java之注解初探
Java之注解初探
来来来过来挨到我坐 发表于2年前
Java之注解初探
  • 发表于 2年前
  • 阅读 10
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

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

}


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 13
码字总数 7493
×
来来来过来挨到我坐
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: