Вычислить сигнатуру функции Java

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

что это правила вычислить подпись?

6 ответов


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

есть таблица сигнатур типов на в этом разделе:

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 на основе отражения, это было бы достаточно просто; просто используйте таблицу выше с правилами для обработки объектов и массивов.


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


быстрый поиск 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        [ 

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

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


С JLS, §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.

Итак, "правило"

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


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