toString com reflection

3 respostas
black_fire

Fala ae galera, blz?

Estou com um probleminha:
Fiz um VO abstrato implementando o método toString. Esse metodo pega todos os campos públicos da classe e exibe os seus nomes e valores. Até aqui tudo bem.
O problema é o seguinte, quando um VO tem uma referencia para ele mesmo, o método toString entra em um looping infinito!
Como posso resolver isso, alguem tem alguma idéia?

Super abraço pra todos!

PS: Implementação do método
public String toString() {

		String mask = "[{0}] {1} ";
		String values = "";

		Class cls = getClass();
		Field[] fields = cls.getDeclaredFields();

		for (int i = 0; i < fields.length; i++) {

			String fieldName = fields[i].getName().substring(0, 1)
					.toUpperCase()
					+ fields[i].getName().substring(1,
							fields[i].getName().length());

			String get = "get";

			try {
				Method method = cls.getMethod(get + fieldName, new Class[] {});
				Object obj = method.invoke(this, new Object[] {});

				values += MessageFormat.format(mask, new String[] {
						fields[i].getName(), String.valueOf(obj) });
			} catch (Exception e) {
			}
		}

		return values;
	}

3 Respostas

louds

Usa um Set para guardar quais valores já foram lidos.

_fs

Ou verifique se o tipo do Field não é o tipo do VO.

Z

Todos os seus VOs estendem essa classe abstrata so para herdarem o toString()?

Acho que uma solução melhor seria você criar uma classe ToStringBuilder (eh um exemplo) para fazer esse trabalho e *delegar* o toString() dos VOs para essa classe.

Um exemplo:
class ToStringBuilder {
    public static String myToString(Object o) {
        // TODO: Aqui fica a sua implementacao de toString
    }
}

class MeuVO {
     public String toString() {
          return ToStringBuilder.myToString(this);
     }
}
Criado 19 de abril de 2006
Ultima resposta 19 de abr. de 2006
Respostas 3
Participantes 4