Java 自定义注解@interface

Annotation是那些插入源码中的元数据,注解自身不会做任何事情,它需要工具支持才会有用。

一、注解的定义

注解的本质是借口(通过@interfacee定义),任何使用注解的地方,可看为是接口的实现。

定义如下:

package com.eyu.train.svn.security;

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorize {

	// 访问页面,如:/role.html
	String value();

	int doauth() default 0;
}


其中,Authroize为注解名称;

@Target指定注解作用的范围,其取值可有:

ElementType.ANNOTATION_TYPE注解类型声明

ElementType.CONSTRUCTOR构造方法声明

ElementType.FIELD字段声明(包括枚举常量)

ElementType.LOCAL_VARIABLE局部变量声明

ElementType.METHOD方法声明

ElementType.PACKAGE包声明

ElementType.RARAMETER参数声明

ElementType.TYPE类、接口(包括注解)或枚举

@Retention指定这个注解可以保留多久,其取值:

RetentionPolicy.RUNTIME 编译器将把注解记录到类文件中,在运行时VM将保留注解,因此可以反射性地读取。

RetentionPolicy.CLASS 编译器将把注解记录到类文件中,但在运行时将不会保留注解。

RetentionPolicy.SOURCE 编译器要丢弃的注解。

在注解定义时除上述两个注解,还有:

@Documented 指定这个注解应该包含在注解项的文档中

@Inherited 指定一个注解,作用在父类时,能够自动被子类继承



二、注解的使用

使用注解直接使用@AnnotationName(方法名=“XXX”)即可。

例如:

	@Authorize("account.html")
	@RequestMapping("/account/page")
	@ResponseBody
	public Page<Account> listAccountPager(
			@RequestParam(required = false, defaultValue = "0") int page) {
		return accountService.getAccountPager(page);
	}
使用@Authorize()就可以使用刚刚的定义的注解了,注意String value();可以不用指定value="xxx",如果是其他方法名则需要指定,如:Authorize(doauth=2);


获取注解设置的值:

public static String AnnotationToString(Object obj) throws IllegalArgumentException, IllegalAccessException {
		Class<?> clz = obj.getClass();
		ClassName clzName = clz.getAnnotation(ClassName.class);
		if (clzName == null)
			return clz.getName() + "@" + obj.hashCode();	
		return clzName.value();
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值