使用spring已有2年之久,却还是停留在使用阶段,感觉这么下去不是办法,所以还是想往深处一探究竟。
今天无意中查询到java注解,才了解到原来那些框架里的注解全是基于java所提供的元注解上编写的,也就是说,我们自己也可以自定义注解。参考资料出处:http://blog.sina.com.cn/s/blog_93dc666c0101gzn5.html
首先,新建一个自定义的注解类
<span style="font-size:18px;">import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestA {
String name();
int id() default 0;
Class gid();
}</span>
其中各参数具体的含义可以自行去网上查询,现在注解类已建完,可以直接拿来去注解别的类或方法了,新建一个测试方法
<span style="font-size:18px;">import java.util.HashMap;
import java.util.Map;
@TestA(name="type",gid=Long.class) //类成员注解
public class UserAnnotation {
@TestA(name="param",id=1,gid=Long.class) //类成员注解
private Integer age;
@TestA (name="construct",id=2,gid=Long.class)//构造方法注解
public UserAnnotation(){
}
@TestA(name="public method",id=3,gid=Long.class) //类方法注解
public void a(){
Map m = new HashMap(0);
}
@TestA(name="protected method",id=4,gid=Long.class) //类方法注解
protected void b(){
Map m = new HashMap(0);
}
@TestA(name="private method",id=5,gid=Long.class) //类方法注解
private void c(){
Map m = new HashMap(0);
}
}</span>
将注解放上去后,没报错,好像也没啥特别的效果,这个时候就可以想想spring之类的框架了,比如为什么URL可以执行被注解的方法,大概情况就是,通过注解找到被注解的方法,然后通过java反射去执行方法,那么我们也可以试试通过注解找到这些被注解的元素:
<span style="font-size:18px;">public class ParseAnnotation {
public static void parseTypeAnnotation() throws ClassNotFoundException {
Class clazz = Class.forName("com.tan.Test.UserAnnotation");
Annotation[] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations) {
TestA testA = (TestA)annotation;
System.out.println("id= "+testA.id()+"; name= "+testA.name()+"; gid = "+testA.gid());
}
}
public static void parseMethodAnnotation(){
Method[] methods = UserAnnotation.class.getDeclaredMethods();
for (Method method : methods) {
boolean hasAnnotation = method.isAnnotationPresent(TestA.class);
if (hasAnnotation) {
TestA annotation = method.getAnnotation(TestA.class);
System.out.println("method = " + method.getName()
+ " ; id = " + annotation.id() + " ; description = "
+ annotation.name() + "; gid= "+annotation.gid());
}
}
}
public static void parseConstructAnnotation(){
Constructor[] constructors = UserAnnotation.class.getConstructors();
for (Constructor constructor : constructors) {
boolean hasAnnotation = constructor.isAnnotationPresent(TestA.class);
if (hasAnnotation) {
TestA annotation =(TestA) constructor.getAnnotation(TestA.class);
System.out.println("constructor = " + constructor.getName()
+ " ; id = " + annotation.id() + " ; description = "
+ annotation.name() + "; gid= "+annotation.gid());
}
}
}
//参数注解解析
public static void parseParameterAnnotation() {
Field[] fields = UserAnnotation.class.getDeclaredFields();
for(int i=0;i<fields.length;i++){
boolean hasAnnotation = fields[i].isAnnotationPresent(TestA.class);
if(hasAnnotation){
TestA annotation = fields[i].getAnnotation(TestA.class);
System.out.println("变量名:"+fields[i].getName()+"注解:"+annotation.name()+"==="+annotation.id()+"=="+annotation.gid());
}
}
}
public static void main(String[] args) throws ClassNotFoundException {
// parseTypeAnnotation();
// parseMethodAnnotation();
// parseConstructAnnotation();
parseParameterAnnotation();
}
}</span>
运行main方法,看到这个被注解的变量打印出来了,逻辑是查询所有变量,判断被注解变量,打印。