java自定义注解入门(2)

一、 定义注解

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

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

/*------------注解-----------------*/
//成员变量注解
@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 block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值