【发布时间】:2016-08-25 08:09:38
【问题描述】:
我们在做什么 - 注释驱动的空值和空值检查对象。
我们做得如何 - 创建一个注解并将该注解放在变量声明中。
我不确定我需要使用哪种设计模式才能使其发挥最佳效果
。请提出建议。
注解类-
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
/**
* Message.
*
* @return the string
*/
public String message();
}
我们如何声明变量 -
@Test(message="five message")
private String five;
我如何调用注释处理器 -
Class<?> annotationClass = annotationTestinClass.getClass();
Field[] decalaredFieldsArray = annotationClass.getDeclaredFields();
List<String> lstString = new ArrayList<>();
parseFields(decalaredFieldsArray,annotationTestinClass,lstString);
我如何处理对象 -
public static List<String> parseFields(Field[] decalaredFieldsArray,Object obj,List<String> lstString){
Arrays.stream(decalaredFieldsArray).forEach(field ->{
field.setAccessible(true);
Test test = field.getDeclaredAnnotation(Test.class);
if(field.getType().isPrimitive() || field.getType().getName().equals("java.lang.String")){
if(field.isAnnotationPresent(Test.class)){
try {
System.out.println("field value is :"+field.get(obj));
System.out.println("field Name is :"+field.getName());
if(field.get(obj)== null || !StringUtils.isNoneBlank(field.get(obj).toString())){
lstString.add(test.message());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}else{
Field[] objectFields =null;
Object objValue = null;
try {
if(field.isAnnotationPresent(Test.class)){
objValue = field.get(obj);
if(objValue!=null){
objectFields = objValue.getClass().getDeclaredFields();
parseFields(objectFields, objValue, lstString);
}else{
System.out.println("Object value is -"+field.get(obj));
System.out.println("Messsage value is -"+test.message());
lstString.add(test.message());
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
return lstString;
}
这里的 Test.Class 代表我的 Test 注释。
【问题讨论】:
-
如果您在声明中注释变量 - 您想在哪个时间点检查 null?就在声明处?每个第二个星期日?代码的哪一部分应该调用/执行该检查?
-
Optional是一个选项吗? -
@NikolasCharalambidis 这种模式会强制您对特定类进行子类化,这很糟糕。它也与 OP 需要的注解无关。
-
@F1sh 我们在 jar 中使用此代码来检查传递的请求对象值,即我们正在处理该 jar 中的注释。我知道我们在春季有很多可用的注释来检查这一点,但这些注释只会在运行时被触发,如果我在这里错了,请纠正我。
标签: java design-patterns reflection annotations