java创建文件名,对象发送模式

java创建文件名,对象发送模式,java,string,format,Java,String,Format,我正在使用外部配置文件,例如Springboot中的application.yml,程序复制了文件并重命名了文件,但是如果我需要另一个模式,请更改文件名,然后在代码中进行更改 让我们假设以下代码: public class Pet { private chain name; private rope bread; private chain size; PrivateVar private chain; Getters and Setters .... } 我用下面的代码来命名文件: P

我正在使用外部配置文件,例如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);
我可以这样做吗?或者有什么方法可以这样做吗?

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

如果它对你来说还是太硬了,也许反思会有帮助


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

正如Peteef所提到的,这种技巧需要使用Java反射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();
  }
/。。。
字符串文件名=getFileName(classNameFromConfigFile);
//...
String getFileName(String className)引发异常{
Class clazz=Class.forName(className);
StringBuilder nameBuilder=新的StringBuilder();
字符串名称分隔符=“\”;
for(字段:clazz.getDeclaredFields()){
append(nameSeparator).append(field.getName());
}
返回nameBuilder.toString();
}

为什么不简单地重写ToString()方法

根据你的例子:

  @Override
  public String toString() {
    return String.format ("% s_% s_% s_% s", pet.getName (), pet.getBread (), pet.getSize (), pet.getOtherVar ());
  }

这将动态更改。

如果配置文件的文件名具有唯一的命名方案,以便您的程序能够区分配置文件和普通文件,您不认为这是一个好主意吗??