java自定义注解(Annotation)

自定义注解概念

Annotation,通过它程序员可以在不改变原有逻辑的情况下,在原文件嵌入一些补充信息。Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据,他不会影响程序的执行,增加删除Annotation,代码都一如既往的执行。Annotation就像public、static等修饰符一样使用,可用于修饰包、类、方法、构造器、成员变量等。它是一个接口,程序可以通过反射获取指定元素的Annotation对象。由于标记相对更复杂,通常单独占一行。
java中三个基本的Annotation: @Override、@Deprecated、@SuppressWarnings

自定义Annnotation,使用 @interface,看上去和定义接口一样。Annotation简单使用方法如下:

public @interface LoginConfig {
}
@LoginConfig
public void show(){
}
Annotation还可以带成员变量,Annotation的成员变量以无参方法的形式来声明,这和接口很像,如下:
public @interface LoginConfig {
	boolean needLogin();
	String name();
}
@LoginConfig(needLogin=true,name="zhangsan")
public void show(){
}
定义Annotation成员变量时可以为其指定初始值,用default来修饰。
public @interface LoginConfig {
	boolean needLogin() default false;
	String name() default "zhangsan";
}
如果设置了默认值,引用时可以无需指定参数,如果指定了参数,则默认值失效。
@LoginConfig
public void show(){
}
下面定义的Annotation使用了两个系统的元注解,@Target、@Retention, 前者用来指定该注解能修饰的目标,后者用来指定可以保留多久。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginConfig {
	boolean needLogin() default false;
	String name() default "zhangsan";
}

对两个元注解说明如下:

1、@Retention(RetentionPolicy.RUNTIME)

定义的这个注解用于指定被修饰的Annotation可以保留多久,RetentionPolicy.RUNTIME表示注解会在class字节码文件中存在,在运行时可以通过反射获取到,如果是RetentionPolicy.SOURCE则不能通过反射获取到

2、@Target(ElementType.METHOD)

@Target用于指定被修饰的Annotation可以作用于那些程序变量,

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
    boolean needLogin() default true;
    boolean needAuth() default true;
}

这样就定义了一个Annotation:LoginRequired,它有两个参数,needLogin和needAuth,默认都为TRUE。

自定义注解的使用方法和java自带注解一样:

@RequestMapping(value = "/getUserById")
@ResponseBody
@LoginRequired(needLogin = true, needAuth = false)
public void updatePassword() {
    Map<String, Object> rtnMap = Maps.newHashMap();
    returnFastJSON(rtnMap);
}
如何使用自定义注解
先知道一个概念,APT(Annotation process Tools),处理注解的工具。目前先用如下用法:通过反射获取注解的元数据,减少代码量。定义拦截器继承HandlerInterceptorAdapter
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Method method = handlerMethod.getMethod();
    LoginRequired annotation = method.getAnnotation(LoginRequired.class);
    boolean needLogin = true;
    if (annotation != null) {
	needLogin = annotation.needLogin();
    }
    if (needLogin) {
	//TODO
    }
}
return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值