Java注解详解


在很多时候需要基于注解来开发。注解不仅增加了代码的可读性,还增加了开发的速度。这篇文章主要讲述Java 注解。

元注解

元注解用于注解其他注解的。Java 5.0定义了4个标准的元注解,如下:

@Target
@Retention
@Documented
@Inherited

现在来说说这四个元注解有什么作用

@Target

@Target注解用于声明注解的作用范围,例如作用范围为类、接口、方法等。它的取值以及值所对应的范围如下:

CONSTRUCTOR:用于描述构造器
FIELD:用于描述域
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention

该注解声明了注解的生命周期,即注解在什么范围内有效。

SOURCE:在源文件中有效
CLASS:在class文件中有效
RUNTIME:在运行时有效(即运行时保留)	

大多数注解都为RUNTIME

@Documented

是一个标记注解,有该注解的注解会在生成 java 文档中保留。

@Inherited

该注解表明子类是有继承了父类的注解。比如一个注解被该元注解修饰,并且该注解的作用在父类上,那么子类有持有该注解。如果注解没有被该元注解修饰,则子类不持有父类的注解。

自定义注解

在Java开发者,JDK自带了一些注解,在第三方框架Spring 带了大量的注解,这些注解称为第三方注解。在很多实际开发过程中,我们需要定义自己的注解。那么现在以案例的方式来讲解自定义注解。
在注解中,需要使用四种元注解来声明注解的作用范围、生命周期、继承,是否生成文档等。另外在注解中也可以有自己的成员变量,如果一个注解没有成员变量则称为标记注解。注解的成员变量,只支持原始类型、Class、Enumeration、Annoation。

现在定义一个@Writer注解,该注解被Retention、Documented、Inherited、Target修饰,表明该注解的作用范围为类、接口和方法,生命周期为运行时、该注解生成文档,并且子类可继承该注解。该注解有2个成员变量,一个为name一个为 age,代码如下:

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Writer {
	String name();
	int age();
}

那么有了该注解,怎么用呢?
该注解的作用范围为类、方法,写一个WriterTest,代码如下:

@Writer(name = "forezp", age = 12)
public class WriterTest {
	@Writer(name = "miya", age = 10)
	public void writeBlog() {
    	System.out.println("writing blog");
	}
}

该类有了这个注解有何用?
一般来说,用该类修饰的类,需要通过反射来做一下逻辑的开发的工作,可广泛用于AOP、程序的配置等。现在写一个方法通过反射来解析该注解:

public static void main(String[] args) throws ClassNotFoundException {
	Class c = Class.forName("com.forezp.annotation.WriterTest");
	if (c.isAnnotationPresent(Writer.class)) {
		Writer w = (Writer) c.getAnnotation(Writer.class);
		System.out.println("name:" + w.name() + "   age:" + w.age());
	}
	Method[] methods = c.getMethods();
	for (Method method : methods) {
		if (method.isAnnotationPresent(Writer.class)) {
			Writer w = method.getAnnotation(Writer.class);
			System.out.println("name:" + w.name() + "   age:" + w.age());
		}
	}
}

运行该Main方法,控制台打印出如下内容:

name:forezp age:12
name:miya age:10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值