我正在使用外部配置文件,例如Springboot中的application.yml,程序复制文件并重命名文件,但如果我需要另一个模式,则代码中要更改文件的名称。
让我们假设以下代码:
public class Pet {
private chain name;
private rope bread;
private chain size;
PrivateVar private chain;
Getters and Setters ....
}
我用这段代码命名文件:
Pet pet = getPet();
String fileName = String.format ("% s_% s_% s_% s", pet.getName (), pet.getBread (), pet.getSize (), pet.getOtherVar ());
这是问题所在,它不是动态的。
在我的配置文件中,我认为,我可以编写模式并发送一个对象作为输入,并让顾客组织名称。
String.format (pattern_from_the_file_config, pet);
我可以这样做,还是有办法做到这一点?
答案 0 :(得分:1)
考虑使用一种方法(在本例中为Pet)指定并返回文件名。
如果它仍然太难以为您编码,那么反射可能会有所帮助。
但它确实不推荐,危险,只应在必要时使用。在你使用之前要三思而后行。通过这样做,您将失去对代码正确性的控制(例如,如果您在配置文件中键入错误的类字段/方法名称时出错)。
答案 1 :(得分:1)
为什么你不要简单地覆盖ToString()方法?
根据你的例子:
@Override
public String toString() {
return String.format ("% s_% s_% s_% s", pet.getName (), pet.getBread (), pet.getSize (), pet.getOtherVar ());
}
这会动态变化。
答案 2 :(得分:0)
Peteef提到这样的技巧需要 Java Reflection API 用法。如果您了解潜在问题,请考虑以下代码段:
//...
String fileName = getFileName(classNameFromConfigFile);
//...
String getFileName(String className) throws Exception {
Class<?> clazz = Class.forName(className);
StringBuilder nameBuilder = new StringBuilder();
String nameSeparator = "_";
for(Field field : clazz.getDeclaredFields()) {
nameBuilder.append(nameSeparator).append(field.getName());
}
return nameBuilder.toString();
}