2012-07-01 3 views
24

У меня есть класс Dummy, который имеет частный метод под названием sayHello. Я хочу позвонить sayHello снаружи Dummy. Я думаю, что это должно быть возможно с отражением, но я получаю IllegalAccessException. Есть идеи???Как вызвать частный метод извне класса java

+13

Не идея частного, что вы не можете вызвать его извне? – PriestVallon

+0

Да, это возможно с отражением, но точка частного заключается в том, чтобы затруднить вызов методов извне. Может быть, это не будет частным? –

+0

@robert это в той же программе (модуль) –

ответ

50

использовать setAccessible(true) на свой объект Method перед использованием его метода 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

Если вы хотите передать какой-либо параметр в частную функцию вы можете передать его в качестве второго, третьего ..... аргументов функции Invoke. Ниже приведен пример кода.

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

Полного пример вы можете увидеть Here

4

Примера доступа к частному методу (с параметром), используя Java Reflection следующим образом:

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); 
    } 
} 
Смежные вопросы