【问题标题】:Design pattern to use for Null check through Reflection通过反射用于 Null 检查的设计模式
【发布时间】: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


【解决方案1】:

注释不是这样工作的。

您可以创建在编译时得到处理的自定义注解。但是在编译时,很多时候你可能无法检查

@NotNull
private Whatever foo = someBar();

确实导致“不为空”。换句话说:在编译时,@NotNull 后面的任何代码都不能真正决定带注释的变量是否真的不为空。

在运行时,注解......就是:元信息! 含义:如果你想让注解在运行时生效,你需要在做事时检查注解的代码。

示例:您创建@Persist。

然后你就有了一个“处理对象”的框架。并且每当该框架处理某个对象时,它可以检查该注释是否存在,如果存在,则“保留”该对象。

换句话说:

foo = bar;

只会将 bar 分配给 foo;并且有“没有框架”可以检查 foo 是否被 @NotNull 注释,如果 bar 为空,则对该分配做一些事情。

所以,为了让你有所帮助,你需要

  1. 那个新注释
  2. 某种处理对象的“处理器”;并检查它们是否被注释;如果它们被注释,就会发生特殊的事情。

【讨论】:

  • 谢谢鬼猫!!!我们只创建了自己的注释,但我不确定设计方法。你能不能也帮帮我。
  • 查看我的最新更新:重点是 - 只有当你有类似 framework 的代码时,这样的注释才有意义。
猜你喜欢
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2011-09-29
  • 2011-08-23
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多