2012-07-01 9 views
24

Ho una classe Dummy che ha un metodo privato chiamato sayHello. Voglio chiamare sayHello dall'esterno Dummy. Penso che dovrebbe essere possibile con il riflesso ma ottengo un IllegalAccessException. Qualche idea???Come chiamare un metodo privato dall'esterno di una classe java

+13

non è l'idea di privato che non è possibile chiamalo da fuori? – PriestVallon

+0

Sì, è possibile con la riflessione, ma il punto di privato è rendere più difficile chiamare metodi dall'esterno. Forse non dovrebbe essere privato? –

+0

@robert è nello stesso programma (modulo) –

risposta

50

utilizzare setAccessible(true) sull'oggetto Method prima di utilizzare il suo metodo 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 genera anche un'eccezione !!! –

+4

perché 'getMethod' restituisce solo il metodo pubblico, è necessario' getDeclaredMethod' – Pshemo

+0

hai ragione, grazie! –

9

Prima devi ottenere la classe, che è piuttosto semplice, quindi ottenere il metodo con il nome utilizzando getDeclaredMethod allora avete bisogno di impostare il metodo di come accessibile in setAccessible metodo sull'oggetto 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

Se si desidera passare qualsiasi parametro di funzione privata è possibile passare come secondo, terzo ..... argomenti della funzione invoke. Di seguito è riportato un codice di esempio.

Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class); 
meth.setAccessible(true); 
String name = (String) meth.invoke(obj, "Green Goblin"); 

esempio completa si può vedere Here

4

esempio di accesso metodo privato (con parametri) utilizzando Java riflessione come segue:

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