Handle a class of type Object

3

I have the following very complex situation (at least for me).

I have a Person class (Data is fictitious for better understanding, but the idea is the same) like this:

public class Pessoa { 
   private int codigo;
   private String nome;
   // Geters e seters 
}

Now I need to create another class with the name Fmt. This class will be generic, that is, it can receive any type of object as a parameter, for example Person, Payment, Rental, etc. The Fmt class would have to have these methods

public class Fmt {
   public String getAtributo(Objct obj){
      /*Esse método tem a função de me trazer os nomes dos atributos que tem na classe do tipo objeto enviado.
      Por exemplo, se a classe passada for a Pessoa, ele teria que me retornar uma String mais assim: “codigo, nome”*/
   }

   public String getValores(Objct obj){
      /*Esse método tem a função de me trazer os valores dos atributos que tem na classe do tipo objeto enviado.
Por exemplo, se a classe passada for a Pessoa, ele teria que me retornar uma String mais assim: “23, Sabrina” */
   }


   public String getTipos(Objct obj){
      /*Esse método tem a função de me trazer os tipos dos atributos que tem na classe do tipo objeto enviado.
      Por exemplo, se a classe passada for a Pessoa, ele teria que me retornar uma String mais assim: “int, string”*/
      }
   }

All this work will be used to persist on a web server.

I would like to at least have a north of how to start (if that is possible of course, lol).

    
asked by anonymous 19.01.2017 / 19:16

2 answers

4

A possible implementation for private attributes and primitive types will be:

public class Fmt {

    public static String getAtributos(Object obj){
      /*Esse método tem a função de me trazer os nomes dos atributos que tem na classe do tipo objeto enviado.
      Por exemplo, se a classe passada for a Pessoa, ele teria que me retornar uma String mais assim: “codigo, nome”*/
        StringBuilder result = new StringBuilder();
        Class classe = obj.getClass();
        Field[] fields = classe.getDeclaredFields();
        System.out.println(fields.length);
        for (Field field : fields) {
            if( Modifier.isPrivate(field.getModifiers())) {
                if(result.length() > 0)result.append(", ");
                result.append(field.getName());
            }
        }
        return result.toString();
    }

    public static String getValores(Object obj) {
      /*Esse método tem a função de me trazer os valores dos atributos que tem na classe do tipo objeto enviado.
Por exemplo, se a classe passada for a Pessoa, ele teria que me retornar uma String mais assim: “23, Sabrina” */

        StringBuilder result = new StringBuilder();
        Class classe = obj.getClass();
        Field[] fields = classe.getDeclaredFields();
        System.out.println(fields.length);
        for (Field field : fields) {
            if( Modifier.isPrivate(field.getModifiers())) {
                Object value = null;
                field.setAccessible(true);
                try {
                    value = field.get(obj);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if(result.length() > 0)result.append(", ");
                if(value == null){
                    result.append("null");
                }
                else {
                    result.append(value.toString());
                }
            }
        }
        return result.toString();
    }

    public static String getTipos(Object obj){
      /*Esse método tem a função de me trazer os tipos dos atributos que tem na classe do tipo objeto enviado.
      Por exemplo, se a classe passada for a Pessoa, ele teria que me retornar uma String mais assim: “int, string”*/

        StringBuilder result = new StringBuilder();
        Class classe = obj.getClass();
        Field[] fields = classe.getDeclaredFields();
        System.out.println(fields.length);
        for (Field field : fields) {
            if( Modifier.isPrivate(field.getModifiers())) {
                if(result.length() > 0)result.append(", ");
                result.append(field.getType().getSimpleName());
            }
        }
        return result.toString();
    }
}

Example usage:

Pessoa pessoa = new Pessoa();
String result;
result = Fmt.getAtributos(pessoa);
Log.d("FMT", result);
result = Fmt.getTipos(pessoa);
Log.d("FMT", result);
result = Fmt.getValores(pessoa);
Log.d("FMT", result);
    
19.01.2017 / 23:58
3

So I understand you want to do a Reflection, from a researched about it, below I set an example for you, I get all the attributes of the Person class.

public static void main(String[] args) {
    Pessoa n = new Pessoa();
    Class classe = Pessoa.class;
    Field[] atributos = classe.getDeclaredFields(); 
    System.out.println(atributos.length);
    for (Field atributo : classe.getDeclaredFields()) {         
            System.out.println(atributo.getName());      
    }

}

Abs

    
19.01.2017 / 20:07