Manipulating an Object class

Asked

Viewed 1,212 times

3

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

I have a class Person (The data are 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 parameter, for example Person, Payment, Leasing, 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 how to start (if that’s possible of course, rsrs).

  • 1

    How difficult?

  • Take a look at the Reflection API. It’s the best way to access class methods and attributes Check out this link http://rodrigosasaki.com/2013/07/12/api-reflection-do-java/ Hug

2 answers

4


One 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 of use:

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);

3

From what I understand you want to do a Reflection, a researched on this, below I set an example for you, I get all attributes of the class Person.

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

  • Thank you very much, helped me a lot, I left my system much more dynamic and reusable!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.