java自定义注解入门(2)

来源:互联网 发布:淘宝充值软件多钱 编辑:程序博客网 时间:2024/05/28 22:10

一、 定义注解

以下创建两个注解分别作用于类方法和类成员变量

实例目的:为类赋值并检查类成员变量是否合法

/*------------注解-----------------*///成员变量注解@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documented@interface checkValues {public int sizeMin();public int sizeMax();}//方法类型注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@interface setValues {public String value();}
二、创建注解处理器

该处理器完成对类的赋值和检查并打印检查结果

/*------------------注解处理器----------------*/class annotationUitl {public Object exeAnnotation(Class<?> ap) {//获取目标类所有的字段Field[] fields = ap.getDeclaredFields();//获取目标类所有的方法Method[] methods = ap.getDeclaredMethods();Object obj =null;try {//实例化对象 obj= ap.newInstance();//遍历方法赋值for(Method method : methods){// 判断该方法上面是否有setValues注解if(method.isAnnotationPresent(setValues.class)){//获取该方法中setValues注解对象setValues set = (setValues)method.getAnnotation(setValues.class);//把在注解中的变量赋值给对象method.invoke(obj, set.value());}}//遍历属性检查for (Field field : fields) {// 获取该字段上面的所有注解if (field.isAnnotationPresent(checkValues.class)) {//获取该方法中setValues注解对象checkValues check = (checkValues)field.getAnnotation(checkValues.class);int min = check.sizeMin();int max = check.sizeMax();//设置字段访问权限    field.setAccessible(true);//获取对应属性的值    Object o = field.get(obj);    if(o instanceof String){    String str =o.toString();    int i = str.length();    if(i<min||i>max){    System.out.println(obj.getClass().getName()+":"+field.getName()+"长度不合法");    }else{    System.out.println(str+"符合");    }    }    }}} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj;}
三、创建apple类并使用注解

使用刚才自定义注解

<pre name="code" class="java">@checkValues(sizeMin = 1, sizeMax = 10) 检查成员变量长度范围(1-10)
<pre name="code" class="java">@setValues(value = "红富士")  赋值

/*--------------使用注解-------------------*/class apple {@checkValues(sizeMin = 1, sizeMax = 10)private String name;@checkValues(sizeMin = 5, sizeMax = 10)private String type;public String getName() {return name;}@setValues(value = "苹果")public void setName(String name) {this.name = name;}public String getType() {return type;}@setValues(value = "红富士")public void setType(String type) {this.type = type;}}
四、测试运行

public static void main(String[] args) {//创建apple对象apple ap = new apple();//执行注解处理器,返回对象apple obj=(apple)new annotationUitl().exeAnnotation(ap.getClass());System.out.println("name:"+obj.getName());System.out.println("type:"+obj.getType());}
输出结果:










0 0
原创粉丝点击