Tengo una clase Dummy
que tiene un método privado llamado sayHello
. Deseo llamar al sayHello
desde afuera de Dummy
. Creo que debería ser posible con la reflexión, pero me sale un IllegalAccessException
. ¿¿¿Algunas ideas???Cómo llamar a un método privado desde fuera de una clase java
Respuesta
use setAccessible(true)
en su objeto Método antes de usar su método invoke
.
import java.lang.reflect.*;
class Dummy{
private void foo(){
System.out.println("hello foo()");
}
}
class Test{
public static void main(String[] args) throws Exception {
Dummy d = new Dummy();
Method m = Dummy.class.getDeclaredMethod("foo");
//m.invoke(d);// throws java.lang.IllegalAccessException
m.setAccessible(true);// Abracadabra
m.invoke(d);// now its OK
}
}
getMethod también arroja una excepción !!! –
porque 'getMethod' solo devuelve el método público, necesita' getDeclaredMethod' – Pshemo
¡tiene razón, gracias! –
Primero tienes que conseguir la clase, que es bastante sencillo, a continuación, obtener el método por el nombre usando getDeclaredMethod
entonces usted necesita para establecer el método que se puede acceder en setAccessible
método en el objeto Method
.
Class<?> clazz = Class.forName("test.Dummy");
Method m = clazz.getDeclaredMethod("sayHello");
m.setAccessible(true);
m.invoke(new Dummy());
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
Si desea pasar cualquier parámetro a la función privada puede pasar como segundo, tercero ..... argumentos de la función de invocación. Lo siguiente es código de muestra.
Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");
Ejemplo completo se puede ver Here
ejemplo de acceso método privado (con parámetros) utilizando Java reflexión de la siguiente manera:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Test
{
private void call(int n) //private method
{
System.out.println("in call() n: "+ n);
}
}
public class Sample
{
public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
{
Class c=Class.forName("Test"); //specify class name in quotes
Object obj=c.newInstance();
//----Accessing private Method
Method m=c.getDeclaredMethod("call",new Class[]{int.class}); //getting method with parameters
m.setAccessible(true);
m.invoke(obj,7);
}
}
- 1. ¿Puede un método nativo llamar a un método privado?
- 2. Llamar a una clase java desde perl
- 3. ¿Cómo puedo llamar a un destructor privado desde un shared_ptr?
- 4. Llamar a un método protegido desde fuera de una clase en PHP
- 5. Llamar a un método de clase desde esa clase
- 6. Llamar a un Método Java desde Visual Basic 6
- 7. ¿Cómo llamar a un método en Java?
- 8. Acceso a un constructor privado desde fuera de la clase en C#
- 9. Llamar a un método de instancia privada desde un método de clase en Ruby
- 10. Llamar a startActivity() desde fuera del contexto de una actividad
- 11. Llamar a un método de clase dentro de una clase
- 12. C#: ¿Cómo puedo llamar a un método estático de una clase base desde un método estático de una clase derivada?
- 13. ¿Cómo crear un método de clase privado?
- 14. Llamar a cualquier método Java desde C#
- 15. Error: Intento llamar al método privado
- 16. llamar a un método estático dentro de una clase?
- 17. ¿Cómo llamar a un método de una clase?
- 18. Llamar a findViewById() desde fuera de una actividad
- 19. Llamar a un método en un modelo desde una plantilla
- 20. ¿Llamar a una función dentro de un método de clase?
- 21. Llamar a un método miembro no estático desde otro método
- 22. C++: Cómo llamar a una función de la clase padre desde fuera
- 23. Llamar a un método privado xxx usando self.xxx() desde otro método privado que da como resultado el error "método privado` xxx 'llamado "
- 24. Llamar a un método de fragmento desde una actividad primaria
- 25. ¿Llamar a startActivity() desde fuera de una actividad?
- 26. llamar a la función javascript desde fuera de un iframe
- 27. ¿Cómo puedo acceder a un constructor privado de una clase?
- 28. ¿Cómo llamar a un método de python de una clase java?
- 29. Llamar a métodos privados y propiedades privadas desde fuera de una clase en PHP
- 30. Llamar a un método cada vez antes de llamar a cualquier otro método
no es la idea de lo privado que no se puede llamarlo desde afuera? – PriestVallon
Sí, es posible con la reflexión, pero el objetivo de la privacidad es hacer que sea más difícil llamar a los métodos desde el exterior. ¿Tal vez no debería ser privado? –
@robert está en el mismo programa (módulo) –