Form2Object - Mapear formulário pra objeto com reflection

Pessoal, há algum tempo já venho vislumbrando uma maneira de tornar os códigos de meus servlets um pouco menores.
Utilizar hibernate e Xstream fez um grande diferença. Outra boa prática tb foi o padrão de projeto DAO.
O que eu gostaria é de eliminar coisas do tipo

Empresa empresa = new Empresa();
empresa.setNome(request.getParameter(“nome”));
…etc.

Seguindo o mesmo principio do hibernate pensei então em algo que poderia mapear um formulário através do objeto request para objeto e cheguei a uma primeira implementação.

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author Henrique Lima
 */
public class Form2Object {
    
    /** Creates a new instance of Form2Object */
    public Form2Object() {
        
    }
    
   public static Object toObject(Class classe, HttpServletRequest request) {
    
        try {
        
            Object      objeto     = classe.newInstance();
            Enumeration camposForm = request.getParameterNames();
            Field[]     atributos  = merge(classe.getDeclaredFields(), classe.getSuperclass().getDeclaredFields()); 
             
            while(camposForm.hasMoreElements()) {
        
                String nomeCampo  = (String)camposForm.nextElement();
                String valorCampo = request.getParameter(nomeCampo);
                String split[]    = nomeCampo.split("\\.");
        
                // CONSIDERA APENAS OS CAMPOS COM "."
                if(split.length > 0) {
            
                    for(int i = 0; i < atributos.length; i++) {
                
                        Field  atributo   = atributos[i];
                        
                        if(split[split.length - 1].equals(atributo.getName())) {
                        
                            String nomeMetodo = "set" + atributo.getName().substring(0, 1).toUpperCase() + atributo.getName().substring(1);
                            Class  tipos[]    = {atributo.getType()};
                            Object args[]     = {convert(atributo.getType(), valorCampo)};
                            
                            // out.println(nomeMetodo + " : " + split[split.length - 1] + " : " + nomeCampo + " : " + valorCampo + " <br>");
                            Method metodo = classe.getMethod(nomeMetodo, tipos);
                            metodo.invoke(objeto, args);
                        
                        } // if  
                    
                    } // for
            
                } // if split
        
            } // while
            
            return objeto;
            
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
            return null;
        } catch (InstantiationException ex) {
            ex.printStackTrace();
            return null;
        } catch(NoSuchMethodException ex) {
            ex.printStackTrace();
            return null;
        } catch(InvocationTargetException ex) {
            ex.printStackTrace();
            return null;
        }
         
    }
    
    
    private static Field[] merge(Field atributosClasse[], Field atributosMae[]) {
        
        Field ret[] = new Field[(atributosClasse.length + atributosMae.length)];
        
        int ultimo = 0;
        
        for(int i = 0; i < atributosClasse.length; i++) {
            ret[i] = atributosClasse[i];
            ultimo = i;
        }
        
        for(int i = 0; i < atributosMae.length; i++) {
            ret[++ultimo] = atributosMae[i];
        }
        
        return ret;
        
    }
    
    private static Object convert(Class classe, String valor) {
        
        if(classe.equals(Date.class)) 
           return stringToDate(valor);
         
        try {
        Constructor construtor = classe.getConstructor(new Class[] { String.class });
        return construtor.newInstance(new Object[] { valor });
        }
        catch (Exception e) {
        return null;
        }

    } 
    
    private static Date stringToDate(String strData) {
        
        SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
        
        try {
            return formatador.parse(strData);
        } catch (ParseException ex) {
            return null;
        }
           
    }
    
}

Como funciona isso. Eu tenho por exemplo uma classe Pessoa com os atributos nome e email (metodos setters e getters, etc).
Crio um formulário com 2 campos chamados: ob.nn.nome, ob.nn.email.

(eu chamo meus campos de ob.nn aqueles que classifico como obrigatorio (ob) e not null (nn)).
Tenho uma classe em javascript tb, que faz a validação automaticamente do formulário a partir desta nomenclatura.

NO servlet onde o formulário vai postar eu teria:

Pessoa pessoa = (Pessoa)Form2Object(Pessoa.class, request);

Aih desta forma com uma linha eu conseguiria mapear o meu formulário pra um objeto.

A grande pergunta é a seguinte, alguém conhece algo que já faça isso?
Eu pergunto simplesmente pela questão de querer usar algo mais maduro do que apenas essa classezinha besta que funciona em algumas implementações mas poderia ter algum problema (os testes feitos foram poucos).

Alguém tem interesse em ajudar a transformar esta simples classe em algo mais maduro?

Por favor, testem a classe e me diga o que acham, pois embora seja algo simples, poderia ser muito útil.
Enfim, eu to meio perdido com o que fazer… se alguém quiser dar uma força, será benvindo.

Um abraço.

Cara, vc já tem isso implementado no struts struts.apache.org, mas caso vc resolva implementar acho melhor vc usar BeanUtils do projeto Jakarta - Commons

Cara eu não uso Struts, não vou dar meus motivos para não iniciar discussões paralelas. Mas é o seguinte esse beanutils parece ser interessante eu já utilizei algumas coisas do commons mas não conhecia o BeanUtils, procurei algo a respeito e a primeira vista ele não pega diretamente os dados de um form e transforma para objetos, eu gostaria de fazer algo específico pra isso. Conhece mais alguma coisa que poderia me auxiliar nesta empreitada?

Valew a resposta tão rápida.

Eu fiz algo parecido mas nao está maduro como vc disse mas funciona para muitas coisas inclusise List, Set, Map e Vetores de qualquer tipo.


<%-- 
    Document   : index
    Created on : 16/10/2012, 18:16:05
    Author     : pirm
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
        <form action="Servlet" method="POST">
            <!--tipos primitivos e String-->
            <input type="text" name="pessoa.bytee" value="1"/><br/>
            <input type="text" name="pessoa.shortt" value="1"/><br/>
            <input type="text" name="pessoa.intt" value="1"/><br/>
            <input type="text" name="pessoa.longg" value="1"/><br/>
            <input type="text" name="pessoa.floatt" value="1"/><br/>
            <input type="text" name="pessoa.doublee" value="1"/><br/>
            <input type="text" name="pessoa.charr" value="x"/><br/>
            <input type="text" name="pessoa.booleann" value="true"/><br/>
            <input type="text" name="pessoa.string" value="oi"/><br/>
            
            <!--vetores -->
            <input type="text" name="pessoa.arrayByte" value="1"/><br/>
            <input type="text" name="pessoa.arrayShort" value="1"/><br/>
            <input type="text" name="pessoa.arrayInt" value="1"/><br/>
            <input type="text" name="pessoa.arrayLong" value="1"/><br/>
            <input type="text" name="pessoa.arrayFloat" value="1"/><br/>
            <input type="text" name="pessoa.arrayDouble" value="1"/><br/>
            <input type="text" name="pessoa.arrayChar" value="x"/><br/>
            <input type="text" name="pessoa.arrayBoolean" value="true"/><br/>
            <input type="text" name="pessoa.arrayString" value="oi"/><br/>
            
            <input type="text" name="pessoa.arrayByte" value="1"/><br/>
            <input type="text" name="pessoa.arrayShort" value="1"/><br/>
            <input type="text" name="pessoa.arrayInt" value="1"/><br/>
            <input type="text" name="pessoa.arrayLong" value="1"/><br/>
            <input type="text" name="pessoa.arrayFloat" value="1"/><br/>
            <input type="text" name="pessoa.arrayDouble" value="1"/><br/>
            <input type="text" name="pessoa.arrayChar" value="x"/><br/>
            <input type="text" name="pessoa.arrayBoolean" value="true"/><br/>
            <input type="text" name="pessoa.arrayString" value="oi"/><br/>
            
            <input type="text" name="pessoa.arrayByte" value="1"/><br/>
            <input type="text" name="pessoa.arrayShort" value="1"/><br/>
            <input type="text" name="pessoa.arrayInt" value="1"/><br/>
            <input type="text" name="pessoa.arrayLong" value="1"/><br/>
            <input type="text" name="pessoa.arrayFloat" value="1"/><br/>
            <input type="text" name="pessoa.arrayDouble" value="1"/><br/>
            <input type="text" name="pessoa.arrayChar" value="x"/><br/>
            <input type="text" name="pessoa.arrayBoolean" value="true"/><br/>
            <input type="text" name="pessoa.arrayString" value="oi"/><br/>
            
            <!-- Utilizando Collections -->
            <input type="text" name="pessoa.list" value="oi"/><br/>
            <input type="text" name="pessoa.set" value="oi1"/><br/>
            <input type="text" name="pessoa.map" value="oi"/><br/>
            
            <input type="text" name="pessoa.list" value="oi"/><br/>
            <input type="text" name="pessoa.set" value="oi2"/><br/>
            <input type="text" name="pessoa.map" value="oi"/><br/>
            
            <input type="text" name="pessoa.list" value="oi"/><br/>
            <input type="text" name="pessoa.set" value="oi3"/><br/>
            <input type="text" name="pessoa.map" value="oi"/><br/>
            
            <!-- Date -->
            <input type="text" name="pessoa.date.date" value="24"/><br/>
            <input type="text" name="pessoa.date.month" value="0"/><br/>
            <input type="text" name="pessoa.date.year" value="112"/><br/>
            
            <!-- javaBean -->
            <input type="text" name="pessoa.pessoa.bytee" value="1"/><br/>
            <input type="text" name="pessoa.pessoa.shortt" value="1"/><br/>
            <input type="text" name="pessoa.pessoa.intt" value="1"/><br/>
            
            <!-- String com multiplos parameters -->
            <input type="text" name="pessoa.string" value="oi"/><br/>
            <input type="text" name="pessoa.string" value="oi"/><br/>
            <input type="text" name="pessoa.string" value="oi"/><br/>
            <input type="text" name="pessoa.string" value="oi"/><br/>
            
            <input type="submit" value="Enviar"/>
        </form>
    </body>
</html>

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.projeto.controller;

import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author pirm
 */
public class Pessoa implements Serializable {

    private byte bytee;
    private short shortt;
    private int intt;
    private long longg;
    private float floatt;
    private double doublee;
    private char charr;
    private boolean booleann;
    private String string;
    private byte[] arrayByte;
    private short[] arrayShort;
    private int[] arrayInt;
    private long[] arrayLong;
    private float[] arrayFloat;
    private double[] arrayDouble;
    private char[] arrayChar;
    private boolean[] arrayBoolean;
    private String[] arrayString;
    private List list;
    private Set set;
    private Map map;
    private Date date;
    private Pessoa pessoa;

    public Pessoa() {
    }

    public byte getBytee() {
        return bytee;
    }

    public void setBytee(byte bytee) {
        this.bytee = bytee;
    }

    public short getShortt() {
        return shortt;
    }

    public void setShortt(short shortt) {
        this.shortt = shortt;
    }

    public int getIntt() {
        return intt;
    }

    public void setIntt(int intt) {
        this.intt = intt;
    }

    public long getLongg() {
        return longg;
    }

    public void setLongg(long longg) {
        this.longg = longg;
    }

    public float getFloatt() {
        return floatt;
    }

    public void setFloatt(float floatt) {
        this.floatt = floatt;
    }

    public double getDoublee() {
        return doublee;
    }

    public void setDoublee(double doublee) {
        this.doublee = doublee;
    }

    public char getCharr() {
        return charr;
    }

    public void setCharr(char charr) {
        this.charr = charr;
    }

    public boolean isBooleann() {
        return booleann;
    }

    public void setBooleann(boolean booleann) {
        this.booleann = booleann;
    }

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public byte[] getArrayByte() {
        return arrayByte;
    }

    public void setArrayByte(byte[] arrayByte) {
        this.arrayByte = arrayByte;
    }

    public short[] getArrayShort() {
        return arrayShort;
    }

    public void setArrayShort(short[] arrayShort) {
        this.arrayShort = arrayShort;
    }

    public int[] getArrayInt() {
        return arrayInt;
    }

    public void setArrayInt(int[] arrayInt) {
        this.arrayInt = arrayInt;
    }

    public long[] getArrayLong() {
        return arrayLong;
    }

    public void setArrayLong(long[] arrayLong) {
        this.arrayLong = arrayLong;
    }

    public float[] getArrayFloat() {
        return arrayFloat;
    }

    public void setArrayFloat(float[] arrayFloat) {
        this.arrayFloat = arrayFloat;
    }

    public double[] getArrayDouble() {
        return arrayDouble;
    }

    public void setArrayDouble(double[] arrayDouble) {
        this.arrayDouble = arrayDouble;
    }

    public char[] getArrayChar() {
        return arrayChar;
    }

    public void setArrayChar(char[] arrayChar) {
        this.arrayChar = arrayChar;
    }

    public boolean[] getArrayBoolean() {
        return arrayBoolean;
    }

    public void setArrayBoolean(boolean[] arrayBoolean) {
        this.arrayBoolean = arrayBoolean;
    }

    public String[] getArrayString() {
        return arrayString;
    }

    public void setArrayString(String[] arrayString) {
        this.arrayString = arrayString;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public Set getSet() {
        return set;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
    
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.append("\n----------------------------------------------\n\nPessoa:");
        stringBuilder.append("\nbyte: ").append(bytee);
        stringBuilder.append("\nshort: ").append(shortt);
        stringBuilder.append("\nint: ").append(intt);
        stringBuilder.append("\nlong: ").append(longg);
        stringBuilder.append("\nfloat: ").append(floatt);
        stringBuilder.append("\ndouble: ").append(doublee);
        stringBuilder.append("\nchar: ").append(charr);
        stringBuilder.append("\nboolean: ").append(booleann);
        stringBuilder.append("\nString: ").append(string);
        if (arrayByte != null) {
            stringBuilder.append("\narrayByte: ");
            for (byte e : arrayByte) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayShort != null) {
            stringBuilder.append("\narrayShort: ");
            for (short e : arrayShort) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayInt != null) {
            stringBuilder.append("\narrayInt: ");
            for (int e : arrayInt) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayLong != null) {
            stringBuilder.append("\narrayLong: ");
            for (long e : arrayLong) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayFloat != null) {
            stringBuilder.append("\narrayFloat: ");
            for (float e : arrayFloat) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayDouble != null) {
            stringBuilder.append("\narrayDouble: ");
            for (double e : arrayDouble) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayChar != null) {
            stringBuilder.append("\narrayChar: ");
            for (char e : arrayChar) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayBoolean != null) {
            stringBuilder.append("\narrayBoolean: ");
            for (boolean e : arrayBoolean) {
                stringBuilder.append(e).append(",");
            }
        }
        if (arrayString != null) {
            stringBuilder.append("\narrayString: ");
            for (String e : arrayString) {
                stringBuilder.append(e).append(",");
            }
        }
        if (list != null) {
            stringBuilder.append("\nlist: ");
            for (Object o : list) {
                stringBuilder.append(o.toString()).append(",");
            }
        }
        if (set != null) {
            stringBuilder.append("\nset: ");
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                Object o = iterator.next();
                stringBuilder.append(o.toString()).append(",");
            }
        }
        if (map != null) {
            stringBuilder.append("\nmap: ");
            Iterator iterator = map.keySet().iterator();
            while (iterator.hasNext()) {
                Object o = iterator.next();
                stringBuilder.append(o.toString()).append(",");
            }
        }
        if (date != null) {
            stringBuilder.append("\ndate: ").append(date.getDate()).append("/").append((date.getMonth() + 1)).append("/").append((date.getYear() + 1900));
        }
        if (pessoa != null) {
            stringBuilder.append(pessoa);
        }
        stringBuilder.append("\n----------------------------------------------");
        return stringBuilder.toString();
    }
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.projeto.controller;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author pirm
 */
@WebServlet(name = "Servlet", urlPatterns = {"/Servlet"})
public class Servlet extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Pessoa pessoa = (Pessoa) JavaBeanUtils.requestToObject(Pessoa.class, request);
        System.out.println(pessoa);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.projeto.controller;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author pirm
 */
public class JavaBeanUtils {

    public static Object requestToObject(Class classe, HttpServletRequest request) {
        Object object = null;
        try {
            object = classe.getConstructor().newInstance();
        } catch (Exception ex) {
            Logger.getLogger(JavaBeanUtils.class.getName()).log(Level.SEVERE, null, ex);
        }

        Enumeration<String> enumerationString = request.getParameterNames();
        while (enumerationString.hasMoreElements()) {
            String stringParameterName = (String) enumerationString.nextElement();
            StringBuilder stringBuilderAttribute = new StringBuilder();
            for (int i = 0; i < stringParameterName.length(); i++) {
                stringBuilderAttribute.append(stringParameterName.charAt(i));
                if (stringBuilderAttribute.toString().equals(classe.getSimpleName().toLowerCase())) {
                    /*
                     * Quando o nome do stringParameterName for igual ao nome da Class
                     */
                    System.out.println("Classe: " + stringBuilderAttribute);
                    stringBuilderAttribute = new StringBuilder();
                    Object objectReturned = object;
                    for (int j = (i + 2); j < stringParameterName.length(); j++) {
                        char c = stringParameterName.charAt(j);
                        if (c != '.') {
                            stringBuilderAttribute.append(c);
                        } else {
                            /*
                             * É UM OBJETO
                             */
                            System.out.println("MÉTODO: faz(isObject, " + objectReturned.getClass() + ", " + stringBuilderAttribute + ", " + stringParameterName + ", map)");
                            objectReturned = faz(true, objectReturned, stringBuilderAttribute.toString(), stringParameterName, request);
                            stringBuilderAttribute = new StringBuilder();
                        }
                    }
                    /*
                     * É UM ATRIBUTO
                     */
                    System.out.println("MÉTODO: faz(isAttribute, " + objectReturned.getClass() + ", " + stringBuilderAttribute + ", " + stringParameterName + ", map)");
                    faz(false, objectReturned, stringBuilderAttribute.toString(), stringParameterName, request);
                }
            }
        }
        return object;
    }

    private static Object faz(boolean isObject, Object object, String attribute, String parameterName, HttpServletRequest request) {
        if (isObject) {
            /*
             * É UM OBJETO JAVABEAN
             */
            System.out.println("objeto:atributo: " + attribute);
            System.out.println("Checando se o objeto é nulo ... para criar nova instancia !");
            Object objectAttribute = javaBeanGetAttribute(object, attribute);

            if (objectAttribute == null) {
                System.out.println("Objecto é nulo ... criando objeto !");
                Object objectNew = objectAndAttributeToAttributeObject(object, attribute);
                setAttribute(object, attribute, objectNew);
                return objectNew;
            } else {
                System.out.println("Objecto não é nulo ... retornando objeto através do método");
                return javaBeanGetAttribute(object, attribute);
            }
        } else {
            /*
             * É UM ATRIBUTO
             */
            System.out.println("atributo: " + attribute);

            String[] arrayStringAttributeValue = request.getParameterValues(parameterName);

            System.out.println("attribute value: ");
            for (String string : arrayStringAttributeValue) {
                System.out.print("," + string);
            }
            setAttribute(object, attribute, arrayStringAttributeValue);
        }
        return null;
    }

    private static Object javaBeanGetAttribute(Object object, String attribute) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("get");
        for (int i = 0; i < attribute.length(); i++) {
            if (i == 0) {
                Character c = attribute.charAt(i);
                stringBuilder.append(c.toString().toUpperCase());
            } else {
                stringBuilder.append(attribute.charAt(i));
            }
        }
        try {
            return object.getClass().getDeclaredMethod(stringBuilder.toString()).invoke(object);
        } catch (Exception ex) {
            Logger.getLogger(JavaBeanUtils.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    private static void javaBeanSetAttribute(Object object, String attribute, Object value) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("set");
        for (int i = 0; i < attribute.length(); i++) {
            if (i == 0) {
                Character c = attribute.charAt(i);
                stringBuilder.append(c.toString().toUpperCase());
            } else {
                stringBuilder.append(attribute.charAt(i));
            }
        }
        Method[] arrayMethod = object.getClass().getDeclaredMethods();
        Class classField = null;
        for (Method method : arrayMethod) {
            if (method.getName().equals(stringBuilder.toString())) {
                Class[] arrayClassTypes = method.getParameterTypes();
                classField = arrayClassTypes[0];
            }
        }
        try {
            object.getClass().getDeclaredMethod(stringBuilder.toString(), classField).invoke(object, value);
        } catch (Exception ex) {
            Logger.getLogger(JavaBeanUtils.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static Object objectAndAttributeToAttributeObject(Object object, String attribute) {
        Field[] arrayField = object.getClass().getDeclaredFields();
        Object objectNew;
        for (Field field : arrayField) {
            if (field.getName().equals(attribute)) {
                try {
                    Class classField = field.getType();

                    if (classField.equals(List.class)) {
                        classField = ArrayList.class;
                    } else if (classField.equals(Map.class)) {
                        classField = HashMap.class;
                    }
                    objectNew = classField.getConstructor().newInstance();
                    System.out.println("new Instance:" + classField.getSimpleName());
                    return objectNew;
                } catch (Exception ex) {
                    Logger.getLogger(JavaBeanUtils.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return null;
    }

    private static void setAttribute(Object object, String attribute, Object value) {
        System.out.println("metodo: setAttribute(" + object.getClass().getSimpleName() + ", " + attribute + ", " + value.getClass().getSimpleName() + ")");

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("set");
        for (int i = 0; i < attribute.length(); i++) {
            if (i == 0) {
                Character c = attribute.charAt(i);
                stringBuilder.append(c.toString().toUpperCase());
            } else {
                stringBuilder.append(attribute.charAt(i));
            }
        }
        System.out.println("metodo a comparar: " + stringBuilder);

        Method[] arrayMethod = object.getClass().getDeclaredMethods();
        for (Method method : arrayMethod) {
            if (method.getName().equals(stringBuilder.toString())) {
                System.out.println("Classe possui o metodo ..." + method.getName());
                Class[] arrayClassTypes = method.getParameterTypes();
                try {
                    Object objectAttribute = javaBeanGetAttribute(object, attribute);
                    String stringClassField = arrayClassTypes[0].getSimpleName();
                    System.out.println("inserindo objeto do tipo ... " + stringClassField + " em " + method.getName());

                    if (stringClassField.equals("byte") || stringClassField.equals("Byte")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Byte.parseByte(stringValue));
                    } else if (stringClassField.equals("short") || stringClassField.equals("Short")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Short.parseShort(stringValue));
                    } else if (stringClassField.equals("int") || stringClassField.equals("Integer")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Integer.parseInt(stringValue));
                    } else if (stringClassField.equals("long") || stringClassField.equals("Long")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Long.parseLong(stringValue));
                    } else if (stringClassField.equals("float") || stringClassField.equals("Float")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Float.parseFloat(stringValue));
                    } else if (stringClassField.equals("double") || stringClassField.equals("Double")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Double.parseDouble(stringValue));
                    } else if (stringClassField.equals("char") || stringClassField.equals("Character")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, stringValue.charAt(0));
                    } else if (stringClassField.equals("boolean") || stringClassField.equals("Boolean")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        javaBeanSetAttribute(object, attribute, Boolean.parseBoolean(stringValue));
                    } else if (stringClassField.equals("String")) {
                        String[] arrayStringValue = (String[]) value;
                        String stringValue = arrayStringValue[0];
                        if (arrayStringValue.length > 1) {
                            StringBuilder stringBuilder1 = new StringBuilder();
                            for (int i = 0; i < arrayStringValue.length; i++) {
                                if (i != (arrayStringValue.length - 1)) {
                                    stringBuilder1.append(arrayStringValue[i]).append(",");
                                } else {
                                    stringBuilder1.append(arrayStringValue[i]);
                                }
                            }
                            stringValue = stringBuilder1.toString();
                        }
                        javaBeanSetAttribute(object, attribute, stringValue);
                    } else if (stringClassField.equals("byte[]") || stringClassField.equals("Byte[]")) {
                        String[] arrayString = (String[]) value;
                        byte[] array = new byte[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Byte.parseByte(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("short[]") || stringClassField.equals("Short[]")) {
                        String[] arrayString = (String[]) value;
                        short[] array = new short[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Short.parseShort(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("int[]") || stringClassField.equals("Integer[]")) {
                        String[] arrayString = (String[]) value;
                        int[] array = new int[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Integer.parseInt(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("long[]") || stringClassField.equals("Long[]")) {
                        String[] arrayString = (String[]) value;
                        long[] array = new long[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Long.parseLong(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("float[]") || stringClassField.equals("Float[]")) {
                        String[] arrayString = (String[]) value;
                        float[] array = new float[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Float.parseFloat(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("double[]") || stringClassField.equals("Double[]")) {
                        String[] arrayString = (String[]) value;
                        double[] array = new double[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Double.parseDouble(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("char[]") || stringClassField.equals("Character[]")) {
                        String[] arrayString = (String[]) value;
                        char[] array = new char[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = arrayString[i].charAt(0);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("boolean[]") || stringClassField.equals("Boolean[]")) {
                        String[] arrayString = (String[]) value;
                        boolean[] array = new boolean[arrayString.length];
                        for (int i = 0; i < arrayString.length; i++) {
                            array[i] = Boolean.parseBoolean(arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, array);
                    } else if (stringClassField.equals("String[]")) {
                        javaBeanSetAttribute(object, attribute, value);
                    } else if (stringClassField.equals("List") || stringClassField.equals("ArrayList")) {
                        List list = new ArrayList();
                        String[] arrayString = (String[]) value;
                        list.addAll(Arrays.asList(arrayString));
                        javaBeanSetAttribute(object, attribute, list);
                    } else if (stringClassField.equals("Set") || stringClassField.equals("HashSet")) {
                        Set set = new HashSet();
                        String[] arrayString = (String[]) value;
                        for(String string : arrayString){
                            set.add(string);
                        }
                        javaBeanSetAttribute(object, attribute, set);
                    } else if (stringClassField.equals("Map") || stringClassField.equals("HashMap")) {
                        Map map = new HashMap();
                        String[] arrayString = (String[]) value;
                        for (int i = 0; i < arrayString.length; i++) {
                            map.put(i, arrayString[i]);
                        }
                        javaBeanSetAttribute(object, attribute, map);
                    } else {
                        javaBeanSetAttribute(object, attribute, value);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(JavaBeanUtils.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}