我有一個Dummy
類,該類有一個名爲sayHello
的私有方法。我想從Dummy
以外撥打sayHello
。我認爲這應該可以反思,但我得到一個IllegalAccessException
。有任何想法嗎???如何從java類以外調用私有方法
24
A
回答
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
}
}
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);
}
}
相關問題
- 1. 如何調整私有類的方法
- 2. 如何從私有基類調用靜態方法?
- 3. 從Ruby的類方法調用私有實例方法
- 4. 在Scala中調用私有Java方法
- 5. 調用抽象類的私有方法
- 6. 調用私有方法static.private類
- 7. 派生類如何調用基類的私有方法?
- 8. 如何使除測試以外的所有調用方都成爲私有的Java方法?
- 9. 類方法:以私有方法傳遞私有數據字段
- 10. 調用類定義之外的私有方法
- 11. 如何使用反射(Java)調用私有靜態方法?
- 12. 私有類調用其外部類
- 13. 從父類調用私有父類方法(django)
- 14. 從__callStatic調用私有靜態方法
- 15. Groovy調用Java超類的私有方法
- 16. 調用私有方法
- 17. 爲什麼你可以從對象範圍之外調用私有方法?
- 18. 靜態調用方法時如何訪問私有類變量?
- 19. Powermockito/Java - 正在測試的間諜類以驗證私有方法調用
- 20. 如何調用插件主體類以外的類的方法
- 21. Ruby類使用靜態方法調用私有方法?
- 22. Java:私有方法vs最終類
- 23. 從閉包(類內)調用私有靜態方法
- 24. 從派生類調用私有方法與Reflection.Emit
- 25. 如何從多個私有方法調用變量?
- 26. 如何在JavaScript中從外部類調用「類方法」?
- 27. 調用從罐類以外的類方法
- 28. 如何從java中的不同類中的私有類訪問公共方法?
- 29. 是否可以從Java中的子類訪問父類的私有方法?
- 30. 如何單元測試調用私有方法鏈的方法?
不是私有的想法,你不能從外面調用它? – PriestVallon
是的,它可以用反射來實現,但是私人的目的在於讓從外部調用方法變得更加困難。也許它不應該是private_? –
@robert它在同一個程序(模塊) –