2012-07-01 57 views
24

我有一個Dummy類,該類有一個名爲sayHello的私有方法。我想從Dummy以外撥打sayHello。我認爲這應該可以反思,但我得到一個IllegalAccessException。有任何想法嗎???如何從java類以外調用私有方法

+13

不是私有的想法,你不能從外面調用它? – PriestVallon

+0

是的,它可以用反射來實現,但是私人的目的在於讓從外部調用方法變得更加困難。也許它不應該是private_? –

+0

@robert它在同一個程序(模塊) –

回答

50

在您的Method對象上使用setAccessible(true),然後使用其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也會拋出一個異常! –

+4

因爲'getMethod'只返回公共方法,所以你需要'getDeclaredMethod' – Pshemo

+0

你是對的,謝謝! –

9

首先你得讓類,這是非常簡單的,然後得到通過getDeclaredMethod那麼你需要通過setAccessible方法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

如果你想傳遞的任何參數私人功能,您可以把它作爲調用函數的第二,第三.....參數。以下是示例代碼。

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

完整例如,你可以看到使用Java反射如下訪問私有方法(帶參數)Here

4

實施例:

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); 
    } 
} 
相關問題