Imprimir variaveis de uma classe

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?

grato!

1 curtida

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;
	
}
1 curtida

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.

Por exemplo:

class Funcionario {
    private String nome;
    private int cod;
    ...
    public String toString() {
        return String.format ("nome = %s, cod = %d, endereco = %s", nome, cod, endereco);
    }
}
...

Funcionario f1 = new Funcionario();
Funcionario f2 = new Funcionario();
...
System.out.println (f1); // imprime "nome = Joao, cod = 100, endereco = R. dos Bobos, no. 0"
System.out.println (f2); // imprime "nome = Maria, cod = 101, endereco = Av. Onde Judas perdeu as botas, no. 10000"
1 curtida

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
*/
1 curtida

A melhor maneira será sobrescrevendo o método toString() …

sobre escrever o método toString já me trouce muitas vantagens, mesmo por isso acho que é uma boa ideia você substituir ele é melhor

Vamos lá.

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

}

Espero ter ajudado, abraço