¿Hay alguna manera de obtener una lista de métodos que serían accesibles (no necesariamente públicos) para una clase determinada? El código en cuestión estará en una clase completamente diferente.Obteniendo una lista de métodos accesibles para una clase dada a través de la reflexión
Ejemplo:
public class A {
public void methodA1();
protected void methodA2();
void methodA3();
private void methodA4();
}
public class B extends A {
public void methodB1();
protected void methodB2();
private void methodB3();
}
Para la clase B
me gustaría llegar:
- todos sus propios métodos
methodA1
ymethodA2
de claseA
methodA3
si y sólo si la claseB
está en el mismo paquete queA
methodA4
nunca debe incluirse en los resultados porque es inaccesible para la clase B
. Para aclarar una vez más, el código que necesita encontrar y devolver los métodos anteriores estará en una clase/paquete completamente diferente.
Ahora, Class.getMethods()
solo devuelve métodos públicos y, por lo tanto, no hará lo que yo quiera; Class.getDeclaredMethods()
solo devuelve métodos para la clase actual. Aunque sin duda puedo usar el último y recorrer la jerarquía de clases comprobando manualmente las reglas de visibilidad, prefiero no hacerlo si hay una solución mejor. ¿Me estoy perdiendo algo obvio aquí?
Eso todavía no hace lo que quiero porque también devolverá los métodos privado/privado del paquete. Su código es perfectamente razonable para encontrar métodos anotados; lo que necesito es averiguar en tiempo de ejecución todos los métodos que la instancia 'B' puede invocar. Como dije, puedo escribir el código para hacerlo (similar a lo que publicó más algunos ifs arrojados para verificar la accesibilidad) pero me preguntaba si hay una mejor manera. – ChssPly76
Bueno, no hay una función API estándar para hacerlo así que usted mismo lo está escribiendo. Eso es. Estás haciendo lo que de alguna manera es un requisito inusual. Por lo general, con la reflexión solo le preocupa lo que ** se puede acceder públicamente, de ahí getMethods() y es por eso que existe esa función auxiliar. No existe tal ayudante (estándar) para lo que quieres, por lo tanto, lo estás escribiendo tú mismo. – cletus
Sé que no hay una API estándar; Esperaba que alguien tuviese un problema similar y encontrara una solución, pero supongo que no. No vi nada relacionado con esto en lugares obvios como beanutils/javassist/etc ... tampoco. El código terminó siendo algo complicado, en realidad, al tener que lidiar con métodos sintéticos en clases anidadas, etc ... – ChssPly76