自定义注解检测数据有效性

[b]自定义注解检测数据有效性[/b]


package com.midea.common;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface ModelFieldValidity {
long max() default Long.MAX_VALUE;
long min() default Long.MIN_VALUE;
long maxLen() default Long.MAX_VALUE;
long minLen() default Long.MIN_VALUE;
boolean enableNull() default false;
}



package com.midea.common.Model;

import com.midea.common.ModelFieldValidity;

public class DescriptionModel {
@ModelFieldValidity(max = 15, min = 0)
private int age;

@ModelFieldValidity(max = 15, min = 0, enableNull = true)
private Integer high;

@ModelFieldValidity(maxLen = 8, minLen = 1, enableNull = true)
private String name;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getHigh() {
return high;
}

public void setHigh(int high) {
this.high = high;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "DescriptionModel [age=" + age + ", high=" + high + ", name=" + name + "]";
}

}




package com.midea.common;

import java.lang.reflect.Field;

public class ModelFieldValidityUtils {

/**
* @param t
* @return 校验通过返回null,校验失败返回失败原因
*/
public static <T> String checkModelFields(T t) {
String result = null;
Field[] fields = t.getClass().getDeclaredFields();
for (Field field : fields) {
ModelFieldValidity modelFieldValidity = field.getAnnotation(ModelFieldValidity.class);
if (null == modelFieldValidity) {
continue;
}
try {
field.setAccessible(true);
Object object = field.get(t);

// 判断是否可以为空
if (null == object) {
boolean enableNull = modelFieldValidity.enableNull();
// System.out.println("enableNull == " + enableNull);
if (!enableNull) {
result = field.getName() + " is null";
return result;
} else {
continue;
}
}

if (object instanceof Number) {
// Number比较
Long max = modelFieldValidity.max();
Long min = modelFieldValidity.min();
// System.out.println("max == " + max);
// System.out.println("min == " + min);
// System.out.println("Number == " + object);
int check = ModelFieldValidityUtils.check(max, min, (Number) object);
if (check == 1) {
result = field.getName() + " = " + object + " > max(" + max + ")";
return result;
} else if (check == -1) {
result = field.getName() + " = " + object + " < min(" + min + ")";
return result;
} else {
continue;
}
} else if (object instanceof String) {
// String比较
Long maxLen = modelFieldValidity.maxLen();
Long minLen = modelFieldValidity.minLen();
// System.out.println("maxLen == " + maxLen);
// System.out.println("minLen == " + minLen);
// System.out.println("String == " + object);
int check = ModelFieldValidityUtils.check(maxLen, minLen, ((String) object).length());
if (check == 1) {
result = field.getName() + " Len = " + ((String) object).length() + " > maxLen(" + maxLen + ")";
return result;
} else if (check == -1) {
result = field.getName() + " Len = " + ((String) object).length() + " < minLen(" + minLen + ")";
return result;
} else {
continue;
}
}

} catch (IllegalArgumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
result = e1.getMessage();
return result;
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
result = e1.getMessage();
return result;
}

}
return result;
}

private static <T extends Number> int check(T max, T min, T object) {
if (object.doubleValue() > max.doubleValue()) {
return 1;
}

if (object.doubleValue() < min.doubleValue()) {
return -1;
}

return 0;
}
}


package com.midea.common;

import java.lang.reflect.Field;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.midea.common.Model.DescriptionModel;

public class ModelFieldValidityUtilsTest {
final static Logger logger = LogManager.getLogger(ModelFieldValidityUtilsTest.class);

public static void main(String[] args) {
DescriptionModel descriptionModel = new DescriptionModel();

descriptionModel.setAge(1);
descriptionModel.setHigh(1);
descriptionModel.setName("asa");

System.out.println("descriptionModel == " + descriptionModel.toString());

// String result = null;

String result = ModelFieldValidityUtils.checkModelFields(descriptionModel);

System.out.println("result == " + result);

}

}



参考原文:http://blog.csdn.net/maguanghui_2012/article/details/69372209
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用自定义注解判断数据类型,你可以按照以下步骤进行操作: 1. 首先,创建一个自定义注解,用于标记需要检查数据类型的元素。例如: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface DataTypeCheck { String dataType(); } ``` 在上述示例中,我们创建了一个名为 `DataTypeCheck` 的自定义注解,并使用 `dataType` 属性来指定要检查数据类型。 2. 接下来,在需要进行数据类型检查的地方,使用该注解标记相应的字段。例如: ```java public class MyClass { @DataTypeCheck(dataType = "String") private String name; @DataTypeCheck(dataType = "int") private int age; // 其他字段... } ``` 在上述示例中,我们在 `name` 字段和 `age` 字段上使用了 `@DataTypeCheck` 注解,并分别指定了要检查数据类型。 3. 最后,编写一个用于检查数据类型的工具类或方法。该工具类或方法可以通过反射获取字段上的注解,并根据注解中指定的数据类型进行判断。例如: ```java import java.lang.reflect.Field; public class DataTypeChecker { public static boolean check(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(DataTypeCheck.class)) { DataTypeCheck annotation = field.getAnnotation(DataTypeCheck.class); String expectedType = annotation.dataType(); Object value = field.get(obj); String actualType = value.getClass().getSimpleName(); if (!expectedType.equals(actualType)) { System.out.println("数据类型错误:" + field.getName()); return false; } } } return true; } } ``` 在上述示例中,我们定义了一个名为 `DataTypeChecker` 的工具类,其中的 `check` 方法可以检查对象中带有 `@DataTypeCheck` 注解的字段是否符合指定的数据类型。 你可以在需要检查数据类型的地方调用 `DataTypeChecker.check` 方法来进行验证。例如: ```java public class Main { public static void main(String[] args) throws IllegalAccessException { MyClass obj = new MyClass(); obj.name = "John"; obj.age = 25; boolean isDataTypeValid = DataTypeChecker.check(obj); System.out.println("数据类型是否有效:" + isDataTypeValid); } } ``` 在上述示例中,我们创建了一个 `MyClass` 对象,并设置了 `name` 和 `age` 字段的值。然后,我们调用 `DataTypeChecker.check` 方法来检查数据类型是否有效,并输出结果。 这样,你就可以使用自定义注解和反射来判断数据类型了。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jie310600

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值