Существует ли способ получить названия параметров метода в Java? [дубликат]

17
задан ansgri 19 December 2008 в 16:50
поделиться

7 ответов

Мы создали пользовательскую аннотацию для метода, который содержит Строку [] названий параметра. Этот подход чувствовал себя немного легче справиться, чем необходимость аннотировать каждый отдельный параметр. Мы планируем добавить время изготовления, проверяя, что количество аннотируемых названий параметра соответствует количеству аргументов, начиная с этого оно, чего мы требуем.

4
ответ дан 30 November 2019 в 10:50
поделиться

Едва ли, но codehaus имеют эту библиотеку, которая сделает для большого количества целей: http://paranamer.codehaus.org/

13
ответ дан 30 November 2019 в 10:50
поделиться

Вот грязное решение, для которого нужна некоторая тонкая настройка. Возможно, кто-то может сделать его лучше.

Недостатки:

  • Требует, чтобы Вы знали местоположение компилируемого файла класса.
  • Это должно быть скомпилировано с флагом-g.

Код:

import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.LocalVariable;
import com.sun.org.apache.bcel.internal.classfile.Method;
import java.io.IOException;

public class Main {

  public static void main(String[] args) throws IOException {
      ClassParser parser = new ClassParser("Main.class");
      JavaClass clazz = parser.parse();

      for (Method m : clazz.getMethods()) {
          System.out.println("Method: " + m.getName());
          int size = m.getArgumentTypes().length;
          if (!m.isStatic()) {
            size++;
          }

          for (int i = 0; i < size; i++) {
              LocalVariable variable = m.getLocalVariableTable().getLocalVariable(i);
              System.out.println("  - Param: " + variable.getName());
          }
      }
  }

  public void a(int myIntParam, String theString) {
  }
}

Вывод:

$ javac -g Main.java
$ java Main
Method: <init>
- Param: this
Method: main
- Param: args
Method: a
- Param: this
- Param: myIntParam
- Param: theString

15
ответ дан 30 November 2019 в 10:50
поделиться

Название параметров присутствует в файле класса, когда код Java был скомпилирован с отладочной информацией (через-g опцию). Файл класса затем содержит атрибут LocalVariableTable (см. http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#5956 ). Это содержит названия локальных переменных, и параметры являются просто локальными переменными. Параметры соответствуют переменным слотам, запускающимся в индексе 1 (или индексе 0 для статических методов).

3
ответ дан 30 November 2019 в 10:50
поделиться

@bobwienholt корректен - названия параметра не компилируются в классы Java и так не доступны во времени выполнения.

2
ответ дан 30 November 2019 в 10:50
поделиться

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

8
ответ дан 30 November 2019 в 10:50
поделиться

Названия параметра доступны до Кв. (теперь часть javac).

0
ответ дан 30 November 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: