moçada seguinte, estou tentando acessar um metodo em uma classe q foi herdado e tem assinatura protected…
o cenário é assim:
Class A{
protected metodoQueQueroAcessar(){ }
}
Class B extends A { }
Class C extends B { }
estou fazendo assim via reflection:
Class classe = objetoQueTenhoDoTipo_C.getClass();
Method metodo = classe.getDeclaredMethod("metodoQueQueroAcessar", new Class[]{});
metodo.setAccessible(true);
metodo.invoke(objetoQueTenhoDoTipo_C, new Object[]{ });
porem sempre obtenho o erro de NoSuchMethod bla bla bla, dizendo q o metodo nao existe na classe e tals… Ai eu peço, como eu acesso via reflection esse metodo herdado??
voce vai ter que ir subindo na hierarquia e procurar o metodo.
getDeclaredMethod só retorna um método que esteja declarado na própria classe que você está chamando. Eu vi que não dá para usar getMethod porque ele só retorna métodos públicos. Olhe o que ocorre…
import java.lang.reflect.*;
class A {
protected void protectedMethod () { System.out.println ("This is a protected
method called from " + getClass().getName()); }
public String toString() { return "A"; }
}
class B extends A {
public String toString() { return "B"; }
}
class C extends B {
public String toString() { return "C"; }
}
class TesteProtectedComReflection {
public static void main(String[] args) throws Exception {
Class<?> klass = C.class;
Method m = null;
while (m == null && klass != Object.class) {
try {
m = klass.getDeclaredMethod ("protectedMethod", new Class[]{});
} catch (NoSuchMethodException ex) {
klass = klass.getSuperclass();
}
}
if (m != null) {
System.out.println (m); // imprime "protected void A.protectedMethod()"
m.invoke (new C()); // imprime "This is a protected method called from C"
} else {
System.out.println ("Method was not found in class C");
}
}
}
opa, entao obrigado aos dois ai …
eu tb tinha descoberto aqui que o getMethod nao ia dá prq ele só retorna os metodos publicos, mas eu achava q o getDeclaredMethod retornava todos (public, private, protected) inclusive os herdados … bom, vivendo e aprendendo
bom de qualquer forma resolvi de forma semelhante ai ao que voce postou thingol, percorrendo a hierarquia de baixo pra cima conforme o Mark_Ameba havia dito …
Vlw aos dois pela ajuda …
[]´s