Objetos populados dinamicamente

Salve Salve galera.

Tenho por exemplo minha classe Pessoa com seus atributos nome e idade, ambos private com seus métodos de acesso get e set.Também tenho minha tabela Pessoa respectivamente com os mesmos atributos.A forma mais comun de preencher o objeto Pessoa é dando um set nos seus atributos, até ai ta todo mundo CARECA de saber.
A minha duvída é a seguinte:
Teria eu pobre e relez mortal, possiblidade de preencher este objeto dinamicamente,
afinal o nome das campos são os mesmos somente “setaria” seus valores.
Conseguir o metodo até consigo,não sei se é a forma correta :

		Class classe = obj.getClass();
		Method method[] = classe.getDeclaredMethods();
		for(int i=0;i<method.length;i++){
			if(method[i].getName().indexOf("set")>=0){
				method[i].getName();	
			}
		}

Mas ai chegar ao ponto final que é “popular”, se é que posso chamar assim, o objeto ja são outros quinhentos.

Se algum de voces conheçe alguma API, classe ou ainda talvez isso nem seja possivel, deêm um toque ai.

Valeu.

Não reinvente a roda:

http://www.hibernate.org/
http://ibatis.apache.org/
http://java.sun.com/products/jdo/index.jsp

Ola, eu fiz um treco deste a pouco tempo… e sou relez mortal tb :wink:

Mas vamos lá… eu fiz assim:


public void popula(Object ob, String nameField, Object value){
  try{
    String methodName = "set"+ nameField.substring(0,1).toUpperCase() + nameField.substring(1);
     Method setterMethod = ob.getClass().getDeclaredMethod(methodName, new Class[]{value.getClass()});
     setterMethod.invoke(ob, new Object[]{value});
  }catch(Exception e){}
}

Ou algo parecido… mas acho que o caminho foi este mesmo…

A resposta para seu problema é o uso de um Desig Pattern conhecido como Property Container com Hastable (também poderia ser um HashMap). Tenho um paper que explica melhor. Se quiser, e-mail-me.

Segue exemplo mencionado no paper:

public abstract class PropertyContainerImpl
implements PropertyContainer, Serializable
{
protected Hashtable ivProperties = new Hashtable(2);
public PropertyContainerImpl() {
}
/**
* Add a property associated with a token name.
* If the token already exists, the value will be replaced.
* If the token does not exist, it will be added with the value.
* @param value is an object that cannot be null
* @param token is a key that can be used to retrieve the value
*/
public void addPropertyBy(Object value, String token) {
if(value==null || token==null) return;
if(ivProperties.containsKey(token)){
ivProperties.remove(token);
}
ivProperties.put(token, value);
}
/**
* Retrieve a value by a particular token.
* @param token is a key that can be used to retrieve the value
* @return Object is the value associated with the token. It
* will not be null.
*/
public Object getPropertyBy(String token) {
if(token==null) return null;
return ivProperties.get(token);
}
/**
* Retrieve all property keys currently in use.
* @return String[] is an array of all valid token names.
*/
public String[] getPropertyKeys() {
String keys[] = null;
synchronized(ivProperties){
int s = ivProperties.size();
keys = new String[s];
Enumeration e = ivProperties.keys();
int i = 0;
while(e.hasMoreElements()){
keys[i] = (String)e.nextElement();
i++;
}
}
return keys;
}
/**
* Remove a value associated with a particular token.
* @param token is a key associated with a value that was added
*/
public void removeProperty(String token) {
if(token==null) return;
ivProperties.remove(token);
}
}

Jairelton
Cara vc tem razão. Já conhecia o hibernate mas nao o JDO o qual achei bem interessante e ja estou estudando sobre.Obrigado pela dica.

BrunoCarlo
Testei teu codigo e deu certo.Como é algo que é pra ontem é bem o que eu preciso, valeu pela ajuda.Mas volto a bater na mesma tecla do jairelton realmente não precisamos reiventar a roda.Valeu mesmo.

Taz:
Vou te mandar um e-mail pra vc sobre este paper, também quero aprender mais um item que não conhecia.

Obrigado aos três graças pessoas como vcs que o portal java é um site 10. :razz:

Farow