Olá gente,
gostaria de saber se existe algum método em que eu possa imprimir todas as variáveis de um objeto, através do System.out.println();…
Exemplo:
Eu criei uma classe Funcionario que possui 3 strings e 2 doubles.
Eu construí um objeto joao, pertencente a esta classe, e setei os valores das variáveis.
Depois disso eu fiz uma série de mudanças através de métodos criados e gostaria de imprimir todas as variáveis de uma vez, sem precisar ficar dando System.out.println() para cada uma. Isso é possível?
A única forma que eu conheço é através de Reflection, comecei a estudar isso a pouco tempo.
public class Main {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
Funcionario f = new Funcionario();
Class<?> c = f.getClass();
Field[] field = c.getDeclaredFields();
for(Field fi : field) {
fi.setAccessible(true);
System.out.println(fi.get(f));
}
}
class Funcionario {
private String nome = "teste";
private double salario = 200.4;
}
Eu recomendaria você deixar de ser preguiçoso e sempre definir o método toString. Assim, você terá as seguintes vantagens:
Como é só para debugar seu programa, você pode escolher exatamente que campos você vai mostrar - em uma classe, há muitos campos que são lixo e você não precisa mostrar.
Um exemplo de campo lixo que vai ser mostrado se você usar reflection é o serialVersionUID, que normalmente não é relevante para você.
Você pode ver o objeto de forma mais amigável em debuggers como a IDE do Eclipse ou NetBeans, já que, quando o método toString está definido, a IDE chama esse método (e mostra só o que você quer ver) em vez de algo bizarro como LSeuPacote/SuaClasse;@1ab23ca ou coisa parecida.
Sem_Nome, reflection é realmente a única forma de fazer isso. Porém, penso que o Molin deseja fazer outra coisa. Ele quer pegar o objeto e imprimir os valores que foram associados a cada atributo, nos diferentes momentos em que ele foi modificando cada valor.
Para isso, ele pode sobrescrever o método toString, retornando todos os atributos e valores ou alguma informação específica.
public class Teste{
private String nome;
private Integer idade;
//getters e setters
@Override
public String toString(){
return "Nome: Dr. " + nome + "\nIdade: " + idade + " anos";
}
}
E, assim que realizar alguma modificação nos valores:
Teste teste = new Teste();
teste.setNome("Amâncio");
teste.idade = 200;
System.out.println(teste);
/* Saída:
Nome: Dr. Amâncio
Idade: 200 anos
*/
Você poderia criar um método dentro da sua classe onde ele faz a impressão de todas as variáveis(atributos) da sua classe
ex:
public class Teste{
//variaveis
private String v1;
private String v2;
private String v3;
public Teste(){
//construtor incializacoes de variaveis
v1 = "Joao";
v2 = "Marcio";
v3 = "Joana";
}
//Metodo que imprime todas as variaveis(atributos da classe)
// Todas as variaveis da classe que deseja imprimir devem conter uma lista de pintln neste metodo
public imprimeValores(){
System.out.println(v1);
System.out.println(v2);
System.out.println(v3);
}
}
Depos no codigo main é só chamar o metedo Imprime Valores e ele ira imprimir tudo, sem precisar fazer a impressao 1 por 1
public class Teste{
//variaveis
private String v1;
private String v2;
private String v3;
public Teste(){
//construtor incializacoes de variaveis
v1 = "Joao";
v2 = "Marcio";
v3 = "Joana";
}
//Metodo que imprime todas as variaveis(atributos da classe)
public imprimeValores(){
System.out.println(v1);
System.out.println(v2);
System.out.println(v3);
}
}
public static void main(String[] args){
Teste objeto_teste = new Teste;
teste.imprimeValores(); //imprime todas as variaveis da classe
}