java - 使用没有 toString 实现的自动生成的类
问题描述
我有一些自动生成的类(模型)作为我正在集成的核心服务的一部分。但是,这些类的作者有意/无意地让toString方法覆盖。我有一些关于如何使用这些类的选项,我需要一些见解。
我可以在我的包中复制这些类,覆盖toString方法,并将这些自动生成的类添加到 .gitignore 中。但是,这种方法的警告是,这些类的任何未来更改都不会反映在我的代码中,并且新开发人员可能会忘记服务和我的实现中的不兼容。
我可以为顶级类创建一个包装类并添加 toString,但是我必须为每个方法调用 getter,如果它包含可能导致某种平面地图创建的嵌套类。(混乱的toString方法)
我正在考虑使用装饰器模式(向类添加功能而不破坏它),但我不确定这是否是它的用途。
我很肯定我不是第一个遇到这个问题的人,所以必须有某种正确的方法来解决它。朝那个方向轻推会很有帮助。
编辑
到目前为止,我观察到唯一的方法是更改字节码或使用反射。但是,更改字节码只会修复受影响的类,而不是所有(未来的)类。相反,我编写了一个自定义记录器,它实现了org.slf4j.Logger并覆盖了信息级别的日志记录,这样它:
对于覆盖了 toString 方法的所有对象,行为相同
使用 jackson 库将对象解析为 Json,并将该 Json 连接到提供的字符串参数
尽管杰克逊在内部使用反射将 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);
}
解决方案
推荐阅读
- node.js - 如何在 NodeJS(Express js)中检测中止的 ajax 请求
- flutter - Flutter : AnimationController - 没有按钮来控制它?
- python - 在python中重命名文件扩展名
- python - 缓慢的 VCF 解析和插入数据库
- jquery - Hide element inside Iframe
- jquery - Make tablesorter post column name instead of column number
- r - simulate a possion process from another poisson process
- assembly - How to read string parameters from stack in nasm
- python - Tkinter - Adjusting widgets
- javascript - 使用 JQuery 自动创建多个滑块