Вычислить сигнатуру функции Java - PullRequest
28 голосов
/ 09 ноября 2011

Есть ли способ вычислить сигнатуру метода класса Java?Подпись
подобно ([Ljava/lang/String;)V представляет функцию, которая принимает String[] в качестве аргумента
и возвращает void.

Что такое правило для вычисления подписи?

Ответы [ 6 ]

41 голосов
/ 09 ноября 2011

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

На этой странице есть таблица сигнатур типов:

Signature    Java Type
Z    boolean
B    byte
C    char
S    short
I    int
J    long
F    float
D    double
V    void
L fully-qualified-class ;    fully-qualified-class
[ type   type[]

Эти два последних означают, что, например, вы называете класс именем, Ljava/lang/Object;, а для именования массива (например) int вы говорите [I, а массив массива int равен [[I.

Если вы хотите буквально вычислить сигнатуру в Java-коде на основе отражения, это было бы достаточно просто;просто используйте приведенную выше таблицу с правилами для обработки объектов и массивов.

9 голосов
/ 02 декабря 2013

Просто запустите javap -s <class-name> в папке, содержащей файлы .class.Он скажет вам со 100% точностью.Не нужно угадывать эти вещи.

4 голосов
/ 09 ноября 2011

Быстрый поиск в Google обнаружил эту веб-страницу:

http://www.rgagnon.com/javadetails/java-0286.html

Подпись состоит из двух частей. Первая часть заключена в круглые скобки и представляет аргументы метода. Вторая часть следует за закрывающей скобкой и представляет тип возвращаемого значения. Соотношение между типом Java и типом C равно

Type     Chararacter 
boolean      Z 
byte         B 
char         C 
double       D 
float        F 
int          I 
long         J 
object       L 
short        S 
void         V 
array        [ 
1 голос
/ 09 ноября 2011

Вы можете найти эту информацию в Спецификации виртуальной машины Java

1 голос
/ 09 ноября 2011

С JLS, & sect; 8.4.2 :

8.4.2 Подпись метода

подпись метода состоит из имени метода и количество и виды формальных параметров метода. Класс не может объявить два метода с одинаковой сигнатурой или ошибка во время компиляции происходит.

Пример:

class Point implements Move {
  int x, y;
  abstract void move(int dx, int dy);
  void move(int dx, int dy) { x += dx; y += dy; }
}

вызывает ошибку во время компиляции, потому что объявляет два move метода с такой же подписью. Это ошибка, хотя один из декларации abstract.

Таким образом, «правило» -

имя метода и число и типы формальных параметров для метода

1 голос
/ 09 ноября 2011

См. здесь для некоторых деталей.

В основном это params, затем возвращаемое значение.

...