您的位置:首页 > 编程语言 > Java开发

java自定义注解入门(2)

2015-12-22 15:11 579 查看
一、 定义注解

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

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

/*------------注解-----------------*/
//成员变量注解
@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());
}输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 注解