Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Там есть таблица титров на на этой странице:

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

Ответ 2

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

Ответ 3

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

Ответ 4

Подробнее см. здесь.

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

Ответ 5

Из 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.

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

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