Java: отражение для вызова методов в непубличном классе, который реализует открытый интерфейс - PullRequest
4 голосов
/ 13 мая 2011

Я пытаюсь использовать отражение, чтобы вызвать метод, имя и аргументы которого известны во время выполнения, и у меня не получается с IllegalAccessException.

Это на объекте, который является экземпляромнепубличный класс, который реализует публичный интерфейс, и у меня есть мозговая судорога, пытающаяся запомнить правильный способ вызова такого метода.

public interface Foo
{
    public int getFooValue();
}

class FooImpl implements Foo
{
    @Override public int getFooValue() { return 42; }
}

Object foo = new FooImpl();

Учитывая объект foo, как бы я назвал foo.getFooValue () рефлексивно?

Если я просматриваю результаты foo.getClass().getMethods(), это должно сработать, но я думаю, что это вызывает IllegalAccessException Это тот случай, когда мне нужно вызвать getDeclaredMethods()?Или я должен пройти через общедоступные интерфейсы / суперклассы и позвонить туда getDeclaredMethods?

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Это работает:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Ex
{
    public static void main(String[] args) throws Exception
    {
        final String methodName = "getFooValue";
        Object foo = new FooImpl();
        Class<?> c = foo.getClass();
        Method m = c.getDeclaredMethod(methodName, null);
        System.out.println(m.invoke(foo));
    }
}

interface Foo
{
    public int getFooValue();
}

class FooImpl implements Foo
{
    @Override public int getFooValue() { return 49; }
}
0 голосов
/ 13 мая 2011

Я думаю, что вы должны вызвать getDeclaredMethods ().

Вот пример :

Method methods[] = secretClass.getDeclaredMethods(); 
System.out.println("Access all the methods"); 
for (int i = 0; i < methods.length; i++) { 
   System.out.println("Method Name: " + methods[i].getName());
   System.out.println("Return type: " + methods[i].getReturnType());
   methods[i].setAccessible(true);
   System.out.println(methods[i].invoke(instance, EMPTY) + "\n");
}

Кстати, пост ссылается на ' отражение частных классов ':

Когда дело доходит до байт-кода (то есть времени выполнения), такого понятия, как закрытый класс, не существует.Это фикция, поддерживаемая компилятором.Для API-рефлексии существует доступный для пакета тип с открытым методом member.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...