Предисловие
Все знают, что с использованием Java8 в соответствующую подпись метода был добавлен новый параметр объекта для представления конкретной информации о параметрах. Соответствующее имя параметра может быть получено через его getName. То есть, как написано в коде, таком как имя пользователя, при прохождении параметров на переднем плане нет необходимости писать аннотации, такие как класс @parameter («Имя пользователя»), но может напрямую отображать по имени.
Ссылка на следующую ссылку на код:
открытый класс T {private interface T2 {void Метод (String username, String Password); } public static void main (string [] args) выбрасывает Exception {System.out.println (t.class.getMethod ("main", string []. Class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("method", string.class, string.class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("method", string.class, string.class) .getParameters () [1] .getName ()); }} Перед Java8 вы также можете получить информацию о имени параметра с помощью некоторых средств, но методы разные. Например, ParameterMethodNameResolver в Spring MVC также может работать нормально в предыдущих версиях. Тем не менее, это требует только специальной компиляции. То, что здесь работает, являются LocalVariableTable и MethodParameters , которые составлены в локальные таблицы переменных и таблицы методов на китайском языке.
LocalVariabletable Local Variable Table
Согласно спецификации JVM, в атрибуте кода существует локальная таблица переменных, а атрибут кода также является атрибутом MethodInfo. Можно понять, что когда метод имеет тело метода, появится соответствующий атрибут кода. В атрибуте кода, в дополнение к конкретному выполнению кода, будет другая информация. Например, LineNumberTable (используется для описания местоположения каждой строки кода).
Таблица локальной переменной является частью информации отладки в методе, поэтому по умолчанию эта информация не будет генерироваться в файле класса. Переключатели -g или -g: VARS необходимо включить. К счастью, для компиляции IDE или Maven эти переключатели включаются по умолчанию. В IDE вы можете управлять им путем настройки (генерировать информацию отладки для идеи) (проверка по умолчанию). В Maven, независимо от того, контролируется ли вывод путем отладки или отладки в подключаемом Maven-Compiler-Plugin (значение по умолчанию верно).
Таблица локальной переменной после Javap, следующим образом:
// Нестатический метод LocalVariabletable: название слота начала. 0 1 1 COUNT J 0 1 3 Имя Ljava/Lang/String; // Статический метод LocalVariabletable: название слота начала.
Таблица локальной переменной не только сохраняет информацию о параметрах, но и сохраняет временные переменные, которые могут использоваться во всем теле метода, таких как объявленный int i и т. Д., И как показано выше, метод и нестатический метод имеют разницу между этой переменной в первой позиции. Следовательно, вы можете прочитать количество параметров ( method.getParameterCount ), а затем прочитать информацию о параметрах указанного номера в таблице локальных переменных в соответствии с подписью метода.
Следует отметить, что на приведенном выше рисунке, если параметр является длинным или вдвое больше, его слот занимает 2 места. При получении информации о параметрах через слот необходимо учитывать информацию о типе параметра.
Поскольку метод интерфейса не имеет атрибута кода, нет локальной таблицы переменных. Если вы получите определение метода интерфейса, вы не можете получить соответствующее имя параметра через таблицу локальной переменной.
Таблица параметров метода MethodParameters
Таблица параметров метода была введена после 1.8, поэтому эта информация доступна только в файлах класса, скомпилированной с JDK8. В отличие от локальной таблицы переменных, она принадлежит атрибуту MethodInfo, то есть он находится на том же уровне, что и атрибут кода. Будь то метод интерфейса или обычный метод, он имеет этот атрибут. Следовательно, даже метод интерфейса может получить соответствующую информацию о параметре.
По умолчанию эта информация не доступна в классе. Для генерации требуется специальная параметры компиляции -параметры необходимо, и эта информация не генерируется по умолчанию в Idea и Maven. В идее, этот параметр компиляции должен быть добавлен в Java дополнительные параметры строки. В Maven этот параметр должен быть добавлен в параметр compilerArgs Maven-Compiler-Plugin.
Таблица параметров метода показана в следующей форме после Javap:
// Нестатический метод метод Параметры: Имя Флаги Имя подсчета // Статический метод метод Параметры: Имя Флаги Args
Можно видеть, что это статическое или нет, только информация, используемая для описания параметров, будет отображаться в таблице параметров. Последующий параметр флагов используется в некоторых специальных сценариях, таких как final параметр для переписывания метода и т. Д.
Некоторые инструменты доступны
В дополнение к использованию собственных API и пружинных инструментов, существуют другие инструменты, которые могут получить информацию по имени параметра. В системе Spring интерфейс, используемый для описания имен параметров, является ParameterNameDiscoverer . Через это можно получить соответствующую информацию о имени параметра. Кроме того, паранамер в com.thoughtworks.paranamer:paranamer инструментарий также может обрабатывать соответствующую информацию. Тем не менее, поддержка JDK8 MethodParameters не очень высока, и пользователи могут достичь своих собственных целей, расширяя их.
Суммировать
Выше приведено метод получения информации о имени параметра метода в коде, обобщенном Java. Я надеюсь, что всем будет полезно учиться или использовать Java. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.