解析自定义注解
这个章节主要是学习解析一个类中的注解;包括类上,构造上,属性上,方法上的注解的信息解析。
自定义的注解
这个自定注解是运行时会被保留的注解,出现的地方没有限制,主要是方便测试。
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");
}
}
###解析注解
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();
}
}
}
}
来源:oschina
链接:https://my.oschina.net/u/2948232/blog/796058