java使用发送模式的对象创建文件名

时间:2018-06-01 22:42:00

标签: java string format

我正在使用外部配置文件,例如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);

我可以这样做,还是有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

考虑使用一种方法(在本例中为Pet)指定并返回文件名。

如果它仍然太难以为您编码,那么反射可能会有所帮助。

Java Reflection API

但它确实不推荐,危险,只应在必要时使用。在你使用之前要三思而后行。通过这样做,您将失去对代码正确性的控制(例如,如果您在配置文件中键入错误的类字段/方法名称时出错)。

答案 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();
  }