首页 > 解决方案 > 使用没有 toString 实现的自动生成的类

问题描述

我有一些自动生成的类(模型)作为我正在集成的核心服务的一部分。但是,这些类的作者有意/无意地让toString方法覆盖。我有一些关于如何使用这些类的选项,我需要一些见解。

  1. 我可以在我的包中复制这些类,覆盖toString方法,并将这些自动生成的类添加到 .gitignore 中。但是,这种方法的警告是,这些类的任何未来更改都不会反映在我的代码中,并且新开​​发人员可能会忘记服务和我的实现中的不兼容。

  2. 我可以为顶级类创建一个包装类并添加 toString,但是我必须为每个方法调用 getter,如果它包含可能导致某种平面地图创建的嵌套类。(混乱的toString方法)

  3. 我正在考虑使用装饰器模式(向类添加功能而不破坏它),但我不确定这是否是它的用途。

我很肯定我不是第一个遇到这个问题的人,所以必须有某种正确的方法来解决它。朝那个方向轻推会很有帮助。


编辑
到目前为止,我观察到唯一的方法是更改​​字节码或使用反射。但是,更改字节码只会修复受影响的类,而不是所有(未来的)类。相反,我编写了一个自定义记录器,它实现了org.slf4j.Logger并覆盖了信息级别的日志记录,这样它:

尽管杰克逊在内部使用反射将 pojo 转换为 json,但我只在没有 myobject.toString() 的情况下这样做。

这是我的自定义记录器的实现。

public class MeinLogger implements Logger {
private static final String REGEX_CURLY = "\\{}";
private static final String TO_STRING = "toString";
private static final String CURLY_ALTERNATE = "REGEX_CURLY";
    private final Logger superLogger;
    private ObjectMapper objectMapper;

    public MeinLogger(Class<?> className) {
        this.objectMapper = new ObjectMapper();
        this.superLogger = LoggerFactory.getLogger(className);
    }

    @Override
    public void info(String s) {

    }

    @Override
    public void info(String s, Object o) {
        boolean toStringImplemented = false;
        try {
            if(checkToStringAndReturn(o).equalsIgnoreCase(CURLY_ALTERNATE))
                toStringImplemented = true;
            s = s.replaceFirst(REGEX_CURLY, checkToStringAndReturn(o));
        } catch (NoSuchMethodException | JsonProcessingException e1) {
            e1.printStackTrace();
        }
        s = s.replaceAll(CURLY_ALTERNATE, REGEX_CURLY);
        if(toStringImplemented) {
            superLogger.info(s, o);
        } else {
            superLogger.info(s);
        }

    }

    @Override
    public void info(String s, Object o, Object o1) {
        List<Object> implementedClasses = new ArrayList<>();
        try {
            if(checkToStringAndReturn(o).equalsIgnoreCase(CURLY_ALTERNATE))
                implementedClasses.add(o);
            s = s.replaceFirst(REGEX_CURLY, checkToStringAndReturn(o));
            if(checkToStringAndReturn(o1).equalsIgnoreCase(CURLY_ALTERNATE))
                implementedClasses.add(o1);
            s = s.replaceFirst(REGEX_CURLY, checkToStringAndReturn(o1));
        } catch (NoSuchMethodException | JsonProcessingException e) {
            e.printStackTrace();
        }
        s = s.replaceAll(CURLY_ALTERNATE, REGEX_CURLY);
        if(implementedClasses.size() > 0)
            superLogger.info(s, implementedClasses.toArray(new Object[0]));
        else
            superLogger.info(s);
    }

    @Override
    public void info(String s, Object... objects) {
        List<Object> implementedClasses = new ArrayList<>();
        for (Object obj : objects) {
            try {
                if(checkToStringAndReturn(obj).equalsIgnoreCase(CURLY_ALTERNATE))
                    implementedClasses.add(obj);
                s = s.replaceFirst(REGEX_CURLY, checkToStringAndReturn(obj));
            } catch (NoSuchMethodException | JsonProcessingException e1) {
                e1.printStackTrace();
            }
        }
        s = s.replaceAll(CURLY_ALTERNATE, REGEX_CURLY);
        if(implementedClasses.size() > 0)
            superLogger.info(s, implementedClasses.toArray(new Object[0]));
        else
            superLogger.info(s);
    }

标签: javadesign-patternstostring

解决方案


推荐阅读