Reuní una pequeña implementación de prueba de esto. La idea básica es llamar format
y pasar la cadena de formato, un mapa de objetos y los nombres que tienen localmente.
El resultado de lo siguiente es:
Mi perro se llama fido y Jane Doe es su dueña.
public class StringFormatter {
private static final String fieldStart = "\\$\\{";
private static final String fieldEnd = "\\}";
private static final String regex = fieldStart + "([^}]+)" + fieldEnd;
private static final Pattern pattern = Pattern.compile(regex);
public static String format(String format, Map<String, Object> objects) {
Matcher m = pattern.matcher(format);
String result = format;
while (m.find()) {
String[] found = m.group(1).split("\\.");
Object o = objects.get(found[0]);
Field f = o.getClass().getField(found[1]);
String newVal = f.get(o).toString();
result = result.replaceFirst(regex, newVal);
}
return result;
}
static class Dog {
public String name;
public String owner;
public String gender;
}
public static void main(String[] args) {
Dog d = new Dog();
d.name = "fido";
d.owner = "Jane Doe";
d.gender = "him";
Map<String, Object> map = new HashMap<String, Object>();
map.put("d", d);
System.out.println(
StringFormatter.format(
"My dog is named ${d.name}, and ${d.owner} owns ${d.gender}.",
map));
}
}
Nota: Esto no se compila debido a excepciones no controladas. Pero hace que el código sea mucho más fácil de leer.
Además, no me gusta que tenga que construir el mapa usted mismo en el código, pero no sé cómo obtener los nombres de las variables locales mediante programación. La mejor manera de hacerlo es recordar poner el objeto en el mapa tan pronto como lo cree.
El siguiente ejemplo produce los resultados que desea de su ejemplo:
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
Site site = new Site();
map.put("site", site);
site.name = "StackOverflow.com";
User user = new User();
map.put("user", user);
user.name = "jjnguy";
System.out.println(
format("Hello ${user.name},\n\tWelcome to ${site.name}. ", map));
}
También debo mencionar que no tengo idea de qué es Velocity, así que espero que esta respuesta sea relevante.
String.format("Hello %s", username);