Obter nome de atributos e metodos através de parametros diamond <>

Saudações pessoal

Gostava de saber se existe alguma forma de ter atributos de uma determinada classe que não sei qual é, mas que será passada através de um parâmetro diamond

por exemplo:

[code]public class NewClass {

public void receberLista(List<T> lista){
    
}

}[/code]

O que quero saber é se tem como eu obter os atributos/métodos que estão definidos no interior da minha classe, se eu passar por exemplo uma classe pessoa no parâmetro eu poder por exemplo fazer

lista.get(0).getNome

ou uma coisa assim, se por exemplo passar String, poder ver um método como lenght

Ou seja quero uma maneira Genérica de poder fazer isso, se alguém já fez ou tem ideia de como se faça peço para que me ajude

Abraços

Bom dia, posso estar enganado, mas dessa forma não será possível pois o “T” pode ser qualquer coisa, então você nunca vai saber quais métodos tem a não ser que use reflexão, acho que não é o caso.

Mas você pode usar no lugar do “T” uma interface e nela definir o métodos que você vai precisar.

Espero ter ajudado.

[quote=AmauriSpPoa]Bom dia, posso estar enganado, mas dessa forma não será possível pois o “T” pode ser qualquer coisa, então você nunca vai saber quais métodos tem a não ser que use reflexão, acho que não é o caso.

Mas você pode usar no lugar do “T” uma interface e nela definir o métodos que você vai precisar.

Espero ter ajudado. [/quote]

Sim era isso que imaginava! mas interface não ira resolver o meu problema exactamente, pois nem sempre poderei resolver esse problema via interface! estou a tentar construir uma meio API que iria me ajudar bastante no meu Serviço, pois estou com uma situação de estar sempre a escrever mesmo código para uma actividade e estar somente sempre a mudar somente as classes que são passadas! estou sempre a escrever todo código de maneira igual mudando somente as classes, e precisaria de métodos como Getters e Setters que fica meio que complicado usar uma interface

Ja ouvi falar de reflexão em Java mas nunca apanhei um tutorial bom, você conhece algum? é possível a base dele ter os getters e setters da classe e depois obter os seus valores ?

Se todos os métodos tem os mesmos getters e setters, talvez você possa fazê-los implementar uma interface em comum.

Mas você pode usar reflection também. Tem um tutorial aqui no GUJ mesmo:

http://www.guj.com.br/articles/10

Gostei desse ‘parâmetro diamond’ hehehehe :smiley:

Creio que vc consiga usando Reflection.

Para pegar a classe que é passada pode ser algo do tipo:

(Class&lt;T&gt;)
		((ParameterizedType)getClass().getGenericSuperclass())
		.getActualTypeArguments()[0];

[quote=wagnerfrancisco]Se todos os métodos tem os mesmos getters e setters, talvez você possa fazê-los implementar uma interface em comum.

Mas você pode usar reflection também. Tem um tutorial aqui no GUJ mesmo:

http://www.guj.com.br/articles/10
[/quote]

Estou ja a tentar implementar no meu Projecto!

Se conseguir posto aqui a solução

[quote=ruben_m]Saudações pessoal

Gostava de saber se existe alguma forma de ter atributos de uma determinada classe que não sei qual é, mas que será passada através de um parâmetro diamond

por exemplo:

[code]public class NewClass {

public void receberLista(List<T> lista){
    
}

}[/code]

O que quero saber é se tem como eu obter os atributos/métodos que estão definidos no interior da minha classe, se eu passar por exemplo uma classe pessoa no parâmetro eu poder por exemplo fazer

lista.get(0).getNome

ou uma coisa assim, se por exemplo passar String, poder ver um método como lenght

Ou seja quero uma maneira Genérica de poder fazer isso, se alguém já fez ou tem ideia de como se faça peço para que me ajude
[/quote]

O que vc quer é ler o tipo genérico T. Do jeito que vc em o codigo não tem como porque o java apaga o tipo quando compila. É o conceito de erasure. Procure por generics erasure no google.

Mas existe uma forma. Só que a sua classe tem que herdar de outra, assim

[code]public class NewClass extends AbstractNewClass{

public void receberLista(List<T> lista){
    
}

}[/code]

Neste caso sim é possível saber qual é a classe T. Isto porque o erasure não se aplica onde ha herança. Ao usar o extends o compilador guarda a classe que está em T. então, ai pode usar o codigo do raf4ever para ler o T.
Uma outra opção, no caso de listas, é pegar o primeiro item da lista e ver qual é a sua classe. Ela terá que ser T

normalmente quem quer saber desta técnica é para usar para criar DAO genéricos. Se é isso que está tentando fazer, não faça. Não crie DAO generico que é uma péssima ideia.

Ja encontrei uma solução parcial para o meu problema, me baseaindo no artigo dado, so esta a faltar me montar um metodo que ira implementar uma de pegar os objectos passados por parametro e os retornos, gostei porque o T aceita que eu pegue a sua Classe, alias é o unico metodo disponivel, mas suficiente com para usar reflexão… mas um pouquinho chego la

Ficou assim ate agora:

[code] public List metodos(String nomeClasse,CharSequence s) throws ClassNotFoundException {
Class c = Class.forName(nomeClasse);
Method methList[] = c.getDeclaredMethods();
List lista = new ArrayList<>();
for (int i = 0; i < methList.length; i++) {
if (methList[i].getName().contains(s)) {
lista.add(methList[i]);
}
}
return lista;
}

public List<Method> getGetters(String nomeClasse) throws ClassNotFoundException{ //Me retorna todos metodos gets
    return this.metodos(nomeClasse, "get");
}

public List<Method> getSetters(String nomeClasse) throws ClassNotFoundException{//Me retorna todos metodos sets
    return this.metodos(nomeClasse, "set");
}    

public List<Class> retornos(List<Method> methods){ //Me indica para que class meus atributos são retornados
    List<Class> retornos = new ArrayList<>();
    for(int i = 0 ; i<retornos.size();i++){
        Class prmt = methods.get(i).getReturnType();
        retornos.add(prmt);
    }
    return retornos;
}

public List<Class[]> parametros(List<Method> methods){ // Me indica os parametros em ordem
    List<Class[]> parametros = new ArrayList<>();
    for(int i=0;i<parametros.size();i++){
        Class [] prmt = methods.get(i).getParameterTypes();
        parametros.add(prmt);
    }
    return parametros;
}

// Falta somente na base dos parametros de entrada poder ler qualquer classe, montar os objectos e executar todos gets e sets
[/code]