这个章节主要是学习解析一个类中的注解;包括类上,构造上,属性上,方法上的注解的信息解析。java
这个自定注解是运行时会被保留的注解,出现的地方没有限制,主要是方便测试。学习
package anotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * 自定义注解 * Created by Administrator on 2016/11/26. */ @Retention(RetentionPolicy.RUNTIME) public @interface Controller { String str(); int id() default 0; Class<Long> gid(); }
这个类主要是给注解赋值,同时对应不一样的地方。测试
package controller; import anotations.Controller; /** * Created by Administrator on 2016/11/26. */ @Controller(str="class",id=1,gid=Long.class)//在类前面 public class ControllerDemo { @Controller(str="field",id=2,gid=Long.class)//在属性前面 private String str; @Controller(str="construct",id=3,gid=Long.class)//在构造方法前面 public ControllerDemo(){ } @Controller(str="public-method",id=4,gid=Long.class)//在方法前面 public void say(){ System.out.println("hello world"); } @Controller(str="private-method",id=5,gid=Long.class)//在方法前面 private void say1(){ System.out.println("hello world"); } @Controller(str="protected-method",id=6,gid=Long.class)//在方法前面 void say2(){ System.out.println("hello world"); } }
###解析注解code
package test.anotations; import anotations.Controller; import org.junit.Test; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by Administrator on 2016/11/29. */ public class ControllerDemoTest { @Test public void test() throws Exception { Class clazz = Class.forName("controller.ControllerDemo"); printMethod(clazz); printField(clazz); printClass(clazz); //打印构造器上的注解和方法、属性相似。 } /** * 打印方法中的注解 */ private void printMethod(Class clazz) { Method[] methods = clazz.getDeclaredMethods();//获取全部方法 for (Method method : methods) { //判断方法是否有注解 boolean hasAnnotation = method.isAnnotationPresent(Controller.class); if(hasAnnotation){ Controller controller = method.getAnnotation(Controller.class); System.out.print("method:"+method.getName()); System.out.print(" str:"+controller.str()); System.out.print(" id:"+controller.id()); System.out.print(" gid:"+controller.gid()); System.out.println(); } } } /** * 打印全部属性注解 * @param clazz */ private void printField(Class clazz){ Field[] fields = clazz.getDeclaredFields();//获取全部属性 for(Field field : fields){ boolean hasAnnotation = field.isAnnotationPresent(Controller.class); if(hasAnnotation){ Controller controller = field.getAnnotation(Controller.class); System.out.print("field:"+field.getName()); System.out.print(" str:"+controller.str()); System.out.print(" id:"+controller.id()); System.out.print(" gid:"+controller.gid()); System.out.println(); } } } /** * 打印类上的注解 * @param clazz */ private void printClass(Class clazz){ Annotation[] annotations = clazz.getAnnotations(); for(Annotation annotation : annotations){ if(annotation instanceof Controller){ Controller controller = (Controller)annotation; System.out.print("class:"+clazz.getName()); System.out.print(" str:"+controller.str()); System.out.print(" id:"+controller.id()); System.out.print(" gid:"+controller.gid()); System.out.println(); } } } }