2012-07-01 26 views
24

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

+13

no es la idea de lo privado que no se puede llamarlo desde afuera? – PriestVallon

+0

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? –

+0

@robert está en el mismo programa (módulo) –

Respuesta

50

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 
    } 
} 
+0

getMethod también arroja una excepción !!! –

+4

porque 'getMethod' solo devuelve el método público, necesita' getDeclaredMethod' – Pshemo

+0

¡tiene razón, gracias! –

9

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()); 
7
method = object.getClass().getDeclaredMethod(methodName); 
method.setAccessible(true); 
method.invoke(object); 
4

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

4

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); 
    } 
} 
Cuestiones relacionadas