最近重构代码,看到jpa中的一些注解。原来写过一些自己的注解,但是后来因为时间长久又忘记了。所以,今天通过看部分文档,重写写了一些小的测试注解。
首先介绍注解中的基本知识,这些都可以找到网上。一个注解的定义主要有三个元素来定义,其中为Documented, target,与rentention三个元素。三个元素的作用如下所述。
Target:用来标识该注解的使用场合,是使用在方法还是一个变量上。而各种场合由一个枚举类型ElementType来定义,其中ElementType的具体截图如下:
另外是注解在什么时候有效,就是@Retention注解的作用,它分三种,由另一个注解RetentionPolicy来标识。Class源文件(只存在源文件中),Resource编译后的文件(生存到编译后的文件),和Runtime运行期有效(在运行期依旧发挥作用)。
基本内容介绍结束,下面是例子。分三个类,Name开发的注解,是一个基于方法的注解;NameAnnotation使用注解的类;UserAnnotation是用来测试注解效果
代码如下:
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Target({METHOD})
@Retention(RUNTIME)
public @interface Name {
String name() default "";
}
package free4lab.code2;
public class NameAnnotation {
@Name(name = "testName")
public String getName(){
return null;
}
package free4lab.code2;
import java.lang.reflect.Method;
public class UserAnnotation {
public static void main(String[] args) throws Exception{
Class<?> claz = Class.forName("free4lab.code2.NameAnnotation");
Method[] method = claz.getMethods();
boolean flag = method[0].isAnnotationPresent(Name.class);<pre name="code" class="java"> //基于方法的注解,获取注解就是需要通过Method反射获取
//如果是基于类的注解,那么就需要通过claz.isAnnotationPresent(Name.class);来判断了
if(flag){System.out.println("....");Name n = (Name) method[0].getAnnotation(Name.class);System.out.println(n.name());}}}