Как получить параметры метода с использованием отражения - PullRequest
2 голосов
/ 13 мая 2011

Я застрял в этом вопросе.Я довольно новичок в рефлексии.

У меня есть метод, скажем:

void foo(String s, int i){...}

Скажем, кто-то вызывает этот метод с входными данными foo("hey", 5);

Как я могуполучить значения "эй" и 5, используя отражение?Когда я пытаюсь это сделать, я просто получаю целую кучу объектных переменных String и Integer.

Ответы [ 3 ]

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

Звучит так, будто вы говорите об АОП (аспектно-ориентированном программировании), а не об отражении.Перехватчик метода даст вам доступ к вызову во время выполнения (включая доступ к аргументам).Способ доступа к аргументам зависит от API.

public class MyMethodInterceptor implements MethodInterceptor {

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("Before: invocation=[" + invocation + "]");

        // use MethodInvocation.getArguments() to access the runtime parameters
        System.out.println(Arrays.toString(methodInvocation.getArguments()));

        Object rval = invocation.proceed();
        System.out.println("Invocation returned");
        return rval;
    }
}

Примечание. AOP - это продвинутая технология, и для ее эффективного использования необходимо выполнить домашнее задание.См. http://static.springsource.org/spring/docs/2.0.2/reference/aop-api.html для подробной информации о приведенном выше примере.

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

Reflection - это доступ к программе на «мета» уровне, так что вы можете поработать с деталями (объектами, классами) того, как она составлена.Доступ к фактическим значениям переменных и параметров осуществляется на обычном «нормальном» уровне.

Я не уверен, почему вы не можете получить доступ к параметрам на обычном «нормальном, неметатическом» уровне, возможно, выпытаясь увидеть параметры метода в стеке или в другом потоке?Для этого вам, вероятно, потребуется использовать интерфейс отладки, такой как JDI .

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

Я думаю, что рефлексия - ошибочный способ думать о том, чего вы хотите здесь делать.

Думайте об отражении, как о взгляде на автомобиль и обнаружении, что у него есть колеса, двигатель, сиденья и т. Д. И какой они типа.Дело не в том, чтобы выяснить, как эти части работают в данный момент.Я знаю, что это не очень хорошая аналогия, но я надеюсь, что это поможет.Отражение означает, что вы смотрите на машину снаружи и решаете, как она выглядит и что она может сделать.Выяснение значений аргументов осуществляется изнутри.

В основном, если у вас есть класс Java, вы можете использовать отражение, чтобы узнать, какие методы, атрибуты у него есть и каковы их типы, и также вызывать их.,Но то, что вы хотите сделать здесь с отражением, похоже на вызов метода и магическое выяснение его аргументов «извне» метода.

Вы сказали: «Я тренируюсь, и я хочу вывести все на дисплей.».почему бы вам просто не записать аргументы или распечатать их в выходной поток?Или, как кто-то сказал, используйте отладчик.

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