Olá galera!!!
Meu problema é o seguinte, a partir de um objeto com o getClass dá pra saber qual é a classe, o problema é que quando for uma interface preciso dar um getClass na classe que está implementando ela para pegar os atributos privados que não estão declarados nessa interface.
Ou seja, caso tenha uma interface, quero varrer os atributos da classe que a implementa.
Acho que dá pra fazer devido em modo debug o eclipse e o netbeans conseguir identificar qual é a classe da implementação e permitir varrer todo o objeto.
Se não me engano daria pra fazer isso utilizando um getClass().asSubclass(), ou getClass.cast(), porém desconheço a classe de implementação.
Abraçooooo.
Deixa eu ver se entendi: você tem uma interface e várias classes que usam implements nela. Você quer, a partir dessa interface, buscar todas essas classes que são subclasses dessa interface?
Não carinha…
tenho um objeto instanciado
quando dou um getClass() é retornada uma interface, mas preciso pegar a classe da implementação.
Tem certeza que mostra a interface?
public interface MyInterface {
}
[code]public class MyFirstSubclass implements MyInterface {
private String myVariable;
}[/code]
[code]import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) {
MyInterface hay = new MyFirstSubclass();
System.out.println(hay.getClass());
for (Field field : hay.getClass().getDeclaredFields()) {
System.out.println(field);
}
}
}
[/code]
[quote]class MyFirstSubclass
private java.lang.String MyFirstSubclass.myVariable[/quote]
Grande André!!!
Não é que funciona mesmo!! Já descobri o meu problema, vou explicar:
A interface:
package com.teste.reflection;
public interface Classe {
public static int PROPRIEDADE_INTERFACE = 1;
}
A implementação
package com.teste.reflection;
class ClasseImpl implements Classe{
private String propriedadeImplementacao;
}
Uma factory qualquer:
package com.teste.reflection;
public class ClasseFactory {
public static Classe createClasse(){
return new ClasseImpl();
}
}
O teste:
import java.lang.reflect.Field;
import com.teste.reflection.Classe;
import com.teste.reflection.ClasseFactory;
public class TesteReflection {
public static void main(String[] args) {
Classe hay = ClasseFactory.createClasse();
System.out.println(hay.getClass());
// utilizando o for que você passou eu consigo encontrar a propriedade
for (Field field : hay.getClass().getDeclaredFields()) {
System.out.println(field);
if(field.getName().equals("propriedadeImplementacao")){
System.out.println("Encontrei o field");
}
}
// mas tentava pegar uma propriedade pelo nome, aí acontecia o erro
try {
System.out.println(hay.getClass().getField("PROPRIEDADE_INTERFACE"));
System.out.println(hay.getClass().getField("propriedadeImplementacao")); // aqui acontece o erro
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
saída no console:
Obrigado carinha!!!
Abraçooooo
Tranquilo. Se não for pedir muito, coloca as tags de resolvido no título do tópico.
Resgatando o tópico…
Quando dou um service.getClass() o que é impresso no console é
Mas no debug do eclipse quando vou na variável aparece o nome da classe…
Como resolvo isso?
Obrigado
Olá Gregory,
Quando você visualiza pelo debug do eclipse, você visualiza o getClass() ou apenas o valor da variável?
Porque o trecho “br.com.teste.ServiceImpl@109bf4d” parece corresponder a um valor retornado por um método toString(), que é o utilizado pelo debug para apresentar o valor de uma variável.
Se puder, coloque o trecho do seu código _o/. Como a saída foi “$Proxy83”, você está utilizando algum framework? A classe que você deu um getClass() é uma entidade ORM ou algum tipo de serviço?
_o/