Relfection + Cast

Bom Dia Pessoal,
Estou com uma dúvida, e um problema que está me atrasando a vida. Por favor, alguem me ajude…

Começa assim, tenho uma classe que estou tentando executar o método Get apartir do nome do atributo, tendo uma situação perfeita, todos os atributos serão encapsulados.
Segue o trecho do código.

	public static Object getRetornoMetodoReflectionByAtributo(Class classeMetodo, String nomeAtributo){
		Object objRetorno = new Object();
		try {
			Method[] metodosClasse = classeMetodo.getDeclaredMethods();
			for(Method metodo : metodosClasse){
				if(metodo.getName().toUpperCase().indexOf("GET" + nomeAtributo.toUpperCase()) > -1){
					if(classeMetodo.getSimpleName().equalsIgnoreCase("ModuloAcessoDadoBean")){
						ModuloAcessoDadoBean  classeModulo = ((ModuloAcessoDadoBean)classeMetodo.cast(classeMetodo.getClass())) = classeMetodo;
						ModuloAcessoDadoBean modBean = classeModulo;
						
						objRetorno = metodo.invoke(modBean, null);
						System.out.println(modBean.getNmModuloAcessoDado() + " - " + metodo.getName() + " = " + objRetorno);
						
					}else if(classeMetodo.getSimpleName().equalsIgnoreCase("AvaliacaoSqlAcessoDadoBean")){
						AvaliacaoSqlAcessoDadoBean AvaliacaoAcessoBean = (AvaliacaoSqlAcessoDadoBean)classeMetodo.cast(new AvaliacaoSqlAcessoDadoBean());
						objRetorno = metodo.invoke(AvaliacaoAcessoBean, null);
						
					}else if(classeMetodo.getSimpleName().equalsIgnoreCase("OcorrenciaRestricaoRegraBean")){
						OcorrenciaRestricaoRegraBean ocorrenciaRestricaoRegraBean = (OcorrenciaRestricaoRegraBean)classeMetodo.cast(new OcorrenciaRestricaoRegraBean());
						objRetorno = metodo.invoke(ocorrenciaRestricaoRegraBean, null);
					}
				}
			}
		}catch (IllegalArgumentException ilegal){
			System.out.println("Erro");
		}catch (Throwable e) {
			System.err.println("-->" + e);
		}
		return objRetorno;
	}

O Cast em si eu consigo fazer, porém meu BEAN (classe que vem no parâmetro) está todo alimentado, e quando faço o Cast perco todas as informações, devido a utilizar o cast assim OcorrenciaRestricaoRegraBean ocorrenciaRestricaoRegraBean = (OcorrenciaRestricaoRegraBean)classeMetodo.cast(new OcorrenciaRestricaoRegraBean());

Na hora que instancio um novo para usar no cast, perco tudo.
Alguem por favor poderia me Ajudar, como faço um cast, sem perder os dados do meu Bean…

Urgente…
Muito Obrigado pessoal…

Sinto muito dizer, mas seu método está completamente errado. Ele deveria ser algo como:

	private static String primeiraLetraMaiuscula (String nomeAtributo) {
		return nomeAtributo.substring(0,1).toUpperCase() + nomeAtributo.substring(1);
	}
	// Aqui supomos que o nome do atributo começa por minúscula ("abacaxiAbacate") e o 
	// getter segue exatamente as normas para getters ("getAbacaxiAbacate").
	// Isso é feito para evitar procurar em todos os métodos,
	// acelerando bastante o processamento. 
	// Também supomos que é um getter sem parâmetros (nas normas é possível ter 
	// getters "indexados" também).
	public static Object getRetornoMetodoReflectionByAtributo (Object obj, String nomeAtributo) {
		// Vamos ver se o objeto pertence a uma classe que tem esse getter
		try {
			Class klass = obj.getClass();
			Method meth = klass.getMethod("get" + primeiraLetraMaiuscula(nomeAtributo), new Class[]{});
			return meth.invoke(obj, new Object[]{});
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) { // se o getter tiver mais de um argumento
			e.printStackTrace();
		} catch (NoSuchMethodException e) { // se não existir o getter
			e.printStackTrace();
		} catch (IllegalAccessException e) { // se o getter não for public
			e.printStackTrace();
		} catch (InvocationTargetException e) { // se o getter lançar uma exceção durante sua execução
			e.printStackTrace();
		}
	}

e ser chamado como:

OcorrenciaRestricaoRegraBean ocorrenciaRestricaoRegraBean = new OcorrenciaRestricaoRegraBean ();
//... Preencher o bean
// Agora digamos que "nome" seja um atributo desse bean, e exista um getter chamado "getNome", com o retorno do tipo String.
String nomeCliente = (String) getRetornoMetodoReflectionByAtributo (ocorrenciaRestricaoRegraBean, "nome");

OcorrenciaRestricaoRegraBean ocorrenciaRestricaoRegraBean = new OcorrenciaRestricaoRegraBean (); //... Preencher o bean // Agora digamos que "nome" seja um atributo desse bean, e exista um getter chamado "getNome", com o retorno do tipo String. String nomeCliente = (String) getRetornoMetodoReflectionByAtributo (ocorrenciaRestricaoRegraBean, "nome");

Thingol,
Muito obrigado pela força, não conheço Reflection direito, estou aprendendo fuçando.
Mas então, entendi seu código, porém no momento da chamada eu não sei Qual Classe irei passar para este método. Tipo deixa eu explicar, Este procedimento poderá ser chamado dentro de um Loop, Iterando sobre um HashMap que vai conter (até no máximo) 3 classes diferentes em seu Valor, a Chave será uma String.
Tipo.

//Isto é somente um exemplo....

HashMap hmClassesObj = new HashMap();
classeObj.put("001", ocorrenciaRestricaoAcessoDadoBean) // Bean ja alimentado
classeObj.put("002", moduloAcessoDadoBean) // Bean ja alimentado
classeObj.put("003", avaliacaoAcessoDadoBean) // Bean ja alimentado

Iterator iterClasses = hmClasseObj.values().iterator();
while(iterClasses.hasNext()){
    //Vamos dizer que ja tenho o atributo...
    Class classeAtual = Class.forName((iterClasses.next()).getClass().getName());
    System.out.prinln(getRetornoMetodoReflectionByAtributo (classeAtual, nomeAtributo));
}

Isto foi só um exemplo de como poderá ser utilizado, escrevi rapidao, pq aqui no serviço é proibido usar internet…

Mas então, neste caso, não sei qual Classe estará indo para o Método…
Será que há alguma forma de fazer isto???

Muito Obrigado

O método proposto pelo Thingol é genérico, não há necessidade de saber qual objeto se está invocando.
Porém é necessário saber qual o método do bean você quer invocar. Nesse caso não consigo ver a necessidade de usar reflection, a menos que esses beans implementem alguma interface comum (ou sejam sub-classes de uma classe comum)…

[]'s

Você está confundindo uma classe com um objeto (instância) dessa classe.
Para você obter o valor de um atributo de um objeto, você precisa do objeto, não da classe. OK?
E é por isso que meu método requer o objeto e não a classe. É que a classe pode ser obtida a partir do objeto usando-se o método getClass.

Se você precisa chamar todos os getters de um determinado bean, e você não sabe nem os nomes das propriedades, não é muito complicado. Vou dar um exemplo daqui a pouco.

package exemplos;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.LinkedHashMap;
import java.util.Map;

public class CallGetter {
/*
	public static Object getRetornoMetodoReflectionByAtributo(Class classeMetodo, String nomeAtributo){
		Object objRetorno = new Object();
		try {
			Method[] metodosClasse = classeMetodo.getDeclaredMethods();
			for(Method metodo : metodosClasse){
				if(metodo.getName().toUpperCase().indexOf("GET" + nomeAtributo.toUpperCase()) > -1){
					if(classeMetodo.getSimpleName().equalsIgnoreCase("ModuloAcessoDadoBean")){
						ModuloAcessoDadoBean  classeModulo = ((ModuloAcessoDadoBean)classeMetodo.cast(classeMetodo.getClass())) = classeMetodo;
						ModuloAcessoDadoBean modBean = classeModulo;
						
						objRetorno = metodo.invoke(modBean, null);
						System.out.println(modBean.getNmModuloAcessoDado() + " - " + metodo.getName() + " = " + objRetorno);
						
					}else if(classeMetodo.getSimpleName().equalsIgnoreCase("AvaliacaoSqlAcessoDadoBean")){
						AvaliacaoSqlAcessoDadoBean AvaliacaoAcessoBean = (AvaliacaoSqlAcessoDadoBean)classeMetodo.cast(new AvaliacaoSqlAcessoDadoBean());
						objRetorno = metodo.invoke(AvaliacaoAcessoBean, null);
						
					}else if(classeMetodo.getSimpleName().equalsIgnoreCase("OcorrenciaRestricaoRegraBean")){
						OcorrenciaRestricaoRegraBean ocorrenciaRestricaoRegraBean = (OcorrenciaRestricaoRegraBean)classeMetodo.cast(new OcorrenciaRestricaoRegraBean());
						objRetorno = metodo.invoke(ocorrenciaRestricaoRegraBean, null);
					}
				}
			}
		}catch (IllegalArgumentException ilegal){
			System.out.println("Erro");
		}catch (Throwable e) {
			System.err.println("-->" + e);
		}
		return objRetorno;
	}

 */
	
	private static String primeiraLetraMaiuscula (String nomeAtributo) {
		return nomeAtributo.substring(0,1).toUpperCase() + nomeAtributo.substring(1);
	}
	// Aqui supomos que o nome do atributo começa por minúscula ("abacaxiAbacate") e o 
	// getter segue exatamente as normas para getters ("getAbacaxiAbacate").
	// Isso é feito para evitar procurar em todos os métodos,
	// acelerando bastante o processamento. 
	// Também supomos que é um getter sem parâmetros (nas normas é possível ter 
	// getters "indexados" também).
	public static Object getRetornoMetodoReflectionByAtributo (Object obj, String nomeAtributo) {
		// Vamos ver se o objeto pertence a uma classe que tem esse getter
		try {
			Class klass = obj.getClass();
			Method meth = klass.getMethod("get" + primeiraLetraMaiuscula(nomeAtributo), new Class[]{});
			return meth.invoke(obj, new Object[]{});
		} catch (SecurityException e) {
			return null;
		} catch (IllegalArgumentException e) { // se o getter tiver mais de um argumento
			return null;
		} catch (NoSuchMethodException e) { // se não existir o getter
			return null;
		} catch (IllegalAccessException e) { // se o getter não for public
			return null;
		} catch (InvocationTargetException e) { // se o getter lançar uma exceção durante sua execução
			return null;
		}
	}
	

	private static String primeiraLetraMinuscula (String nomeAtributo) {
		return nomeAtributo.substring(0,1).toLowerCase() + nomeAtributo.substring(1);
	}

	/**
	 * Chama todos os getters de um determinado objeto.
	 * @param obj
	 * @return
	 */
	public static Map<String,Object> callAllGetters (Object obj) {
		Class klass = obj.getClass();
		Method[] methods = klass.getDeclaredMethods();
		Map<String,Object> valores = new LinkedHashMap<String,Object>();
		for (Method meth : methods) {
			String methName = meth.getName();
			if (methName.startsWith ("get") && !methName.equals("getClass")) {
				String nomeAtributo = primeiraLetraMinuscula(methName.substring(3));
				// Agora vamos ver se o tal método não tem argumentos
				// Se tiver, então não é um getter, e não iremos chamá-lo
				if (meth.getParameterTypes().length > 0)
					continue;
				// Se o getter não for público, não vamos chamá-lo
				if (!Modifier.isPublic(meth.getModifiers()))
					continue;
				// Agora vamos chamar o tal getter
				try {
					Object value = meth.invoke(obj, new Object[]{});
					// Acrescentando o resultado ao map de retorno
					valores.put(nomeAtributo, value);
				} catch (IllegalArgumentException e) { // não deve ocorrer
					e.printStackTrace();
				} catch (IllegalAccessException e) { // não deve ocorrer
					e.printStackTrace();
				} catch (InvocationTargetException e) { // se houver exception dentro do getter
					e.printStackTrace();
				}
			}
		}
		return valores;
	}

	/** Esta classe está bem simplficada, só para você ter uma idéia. */
	static class ModuloAcessoDadoBean {
		private String nome;
		private double saldo;
		public ModuloAcessoDadoBean (String nome, double saldo) {
			this.nome = nome; this.saldo = saldo;
		}
		public String getNome () { return nome; }
		public double getSaldo () { return saldo; }
		public void setNome (String nome) { this.nome = nome; }
		public void setSaldo (double saldo) { this.saldo = saldo; }
	}
	
	public static void main(String[] args) {
		Map<String,Object> valores = callAllGetters (new ModuloAcessoDadoBean ("Jose da Silva", 12345.67));
		System.out.println (valores);
	}
}

Bom Dia Pessoal,
Dmeorei um pouco para responder a este tópico, mas é devido a carga de trabalho. Graças, eu terminei.
E estou voltando aqui para agradecer a ajuda de vocês, Thingol, muito obrigado, você me ajudou muito, seus exemplos forma mto bom, e bem aplicados em minha situação.

Mais uma vez, o GUJ e sesu membros me ajudaram… Simplesmente muito 10, e o melhor Forum que conheço.

Abraços, valeu…

(Encerrando Tópico)