Co prawda napisałem wcześniej o oddzielnym poście na ten temat, po głębszym zastanowieniu nie wydaje mi się jednak, aby temat był na tyle obszerny, by poświęcać na niego oddzielny wpis widoczny na stronie głównej.
Samo kodowanie tych sygnatur nie jest skomplikowane, choć na pierwszy rzut oka tak może wyglądać. Każda sygnatura składa się z dwóch części: części argumentowej i części wartości zwrotnej. Biorąc pod lupę sygnaturę z poprzedniego posta, dotyczącego metody nativeCode, czyli ()V można zauważyć, że część argumentów (czyli część między nawiasami) jest pusta, natomiast za nawiasem stoi V -- i jest to część wartości zwrotnej. V odpowiada za wartość void, zgodnie z tabelką poniżej, tak więc sygnaturę ()V można zdekodować w ten sposób:
- void nazwaMetody();
gdzie nazwaMetody oznacza nazwę metody ;), której nie ma w sygnaturze.
Teraz nieco inny przykład. Dana jest sygnatura ([IC)Ljava/lang/String;. Należy rozłożyć ją na czynniki pierwsze, a więc najpierw podzielić na dwie części:
- Część argumentów: [IC,
- Część wartości zwrotnej: Ljava/lang/String;.
Pierwsza część: otwarty nawias kwadratowy oznacza, że dany typ (o którym parser jeszcze nic nie wie) jest typem tablicowym, a więc przy zamianie sygnatury na prawidłową deklarację w języku Java za nazwą typu powinien się pojawić tablicowy specyfikator [] (np. int[]). Idąc dalej parser napotyka I, co oznacza typ int - i to jest typ pierwszego argumentu przyjmowanego przez metodę. Zgodnie z poprzednim znakiem - [ - typ ten nie jest int'em, ale int[]'em. Idąc dalej napotkać można C, co oznacza char i co jednocześnie jest typem drugiego argumentu.
Druga część: Ljava/lang/String;. Przy rozpoczęciu parsowania tego typu parser napotyka najpierw znak L -- co oznacza typ klasy. Typ ten zapisany jest w widoczny wizualnie sposób, kończy się natomiast na średniku, tak więc typem naszym jest tutaj java/lang/String. Slashe zamieniane są na kropki (wynika to z metody zapisywania w pełni kwalifikowanych nazw klas Java w specyficzny sposób) i wychodzi nazwa klasy: java.lang.String.
Deklaracja wygląda więc tak:
- java.lang.String nazwaMetody(int[], char);
Reszta kombinacji powinna być już łatwa do zdekodowania - np. [Lorg/anadoxin/test/Text; oznacza w praktyce org.anadoxin.test.Text[], czyli tablicę tych obiektów. Na koniec, tabelka:
| Symbol | Znaczenie |
| V | void |
| B | byte |
| C | char |
| D | double |
| F | float |
| I | int |
| J | long |
| S | short |
| Z | boolean |
Załączam też jeden programik, który być może okazać się pomocny, screenshot:

Na koniec link - źródła i binarki (java).
