Вычислить сигнатуру функции 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