Вычислить сигнатуру функции Java
Есть ли способ вычислить подпись метода класса Java? Подпись
как ([Ljava/lang/String;)V
представляет собой функцию, которая принимает аргумент String[]
как аргумент
и возвращает void
.
Какое правило для вычисления подписи?
Ответы
Ответ 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
.
Итак, "правило"
имя метода и количество и типы формальных параметров для метода
Ответ 6
Вы можете найти эту информацию в Спецификация виртуальной машины Java