Popis deklarace metody je následující
MethodDeclaration:
MethodHeader MethodBody
MethodHeader:
MethodModifiersopt TypeParametersopt Result MethodDeclarator Throwsopt
MethodDeclarator:Z popisu je zjevné, že metoda se skládá z hlavičky a těla metody. Hlavička může obsahovat seznam modifikátorů, parametrický typ a referenci na třídu zajišťující zachytávání vjímek. Nutný obsah hlavičky metody je návratový typ a název s případným seznamem přijímaných parametů.
Identifier(
FormalParameterListopt)
Jako modifikátor metody lze použít:
- Annotation
- public
- private
- protected
- abstract
- static
- final
- synchronized
- native
- strictfp
Generickým metodám lze parametrizovat datový typ parametru, návratové hodnoty anebo třídy zajišťující zpracování vyjímek. Typové parametry se při deklaraci metody zadávají do špičatých závorek např.: <T>. Udávají tak název typového parametru v metodě. V extrémním případě může deklarace metody vypadat následovně:
1 2 3 | public <T extends Exception> T method(T prom) throws T{ return prom; } |
V grafu bude každý generický element (typ návratové hodnoty, datový typ parametru, třída pro zpracování vyjímek) navázán vztahem určujícím datový typ na speciální uzel značící typový parametr.
Hlavička metody může obsahovat throws klauzuli pro deklaraci tříd zajišťujících zpracovávání vyjímek. Každá metoda může takto deklarovat žádnou nebo více tříd. Tato vlastnost bude v grafu zaznamenána vztahem throws mezi současnou třídou a referencovanou třídou.
Každá metody má svůj návratový datový typ. Ten může být buď void nebo jiný datový typ. Tato vlastnost bude zachycena vztahem s názvem is_type mezi metodou a referencovaným typem (resp. třídou). Dále bude mít vrchol metody vztah have_parameter se všemi svými parametry. Popis vrcholu parametru je níže.
Je popsáno ukládání hlavičky metody do grafu. Nyní je potřeba extrahovat některé informace z těla metody. Tělo metody obsahuje blok kódu. Z tohoto bloku kódu nás zejména zajímají metody volané z těla, metody volané příkazem throw, třídy využívané v klauzuli catch a používané datové typy. Abychom zachytili všechny metodou používané datové typy, označíme všechny datové typy proměnných v těle metody, parametry a návratové typy jako používané a vytvoří se vztah mezi metodou a referencovanou třídou s názvem uses. Jestliže se v těle metody najde volání jiné metody, vytvoří se vztah mezi metodou, odkud je volána metoda a volanou metodou s názvem call. Dále pokud metoda používá jinou třídu (datový typ) anebo volá metodu nějaké třídy, vytvoří se vztah uses mezi třídou, ve které je metoda deklarována a třídou, která je používaná nebo je je volána některá její metoda. Jestliže se nalezne klauzule throw v bloku kódu, bude vytvořen vztah s názvem call_throw s vrcholem metody, jež odpovídá referenci. Stejným způsobem se naváže vztah uses mezi analyzovanou třídou a třídou deklarující volanou metodu. Poslední požadovaná informace z těla kódu jsou datové typy zachytávaných vyjímek klauzulí catch. Pokud se tedy na nějaký takový datový typ narazí, vytvoří se vztah s názvem catch s patříčnou třídou.
Souhrn
Vlastnosti:
- name (String)
- static (yes/no)
- final (yes/no)
- access (public/private/protected)
- abstract (yes/no)
- synchronized (yes/no)
- native (yes/no)
- strictfp (yes/no)
- is_type (Třída)
- have_parameters (Parametr)
- call (Metoda)
- uses (Třída)
- throws (Třída)
- have_annotation (Anotace)
- call_throw (Metoda)
- catch (Třída)
Parametry
Deklarace metody obsahuje také deklarace parametrů metody. Parametr může následovat po anotaci. Což se v grafu znázorní vztahem parametru s vrcholem anotace s názvem have_annotation. Dále mohou být určeny modifikátory, které však umožňují pouze řetězec final. Tento modifikátor bude tedy zařazen mezi možné vlastnosti vrcholu v grafu. Nutnou součástí je určení datového typu parametru a název parametru. V grafu bude název parametru zařazen mezi vlastnosti vrcholu a typ parametru bude interpretován hranou mezi uzlem parametru a referencovaným typem.
V jazyce Java je možné při deklaraci metody nastavit poslední parametr jako proměnlivý (variable arity parameter). Toto umožuje vložit do parametru libovolný počet parametrů deklarovaného typu. Popis této kontrukce je následující:
VariableModifiersopt Type...
VariableDeclaratorId
Tedy je možné jej rozeznat pomocí třech teček mezi určením typu a názvu parametru. Toto se však může vyskytkou pouze jako poslední parametr. Proměnliné parametry budou v grafu zaznamenány jako pole odpovídajícího datového typu. Tedy pokud bude parametr deklarován podle následující ukázky, bude mít metoda jeden parametr s názvem prom, který bude mít vztah s vrcholem pole a to bude mít vztah s vrcholem String.metoda(String...prom){}
V grafu bude parametr interpretován jako zvláštní vrchol. Podle možných modifikátorů a dalších možných vlastností parametru bude do seznamu vlastností vrcholu ukládáno dle následujícího souhrnu. Navíc se bude ukládat pozice parametru mezi ostatními parametry, protože při porovnávání reference metod je důležitý počet parametrů a posloupnost datových typů.
Souhrn pro parametr
Vlastnosti:
- name (String)
- final (yes/no)
- position (int)
Vztahy:
- is_type (Třída)
- have_annotation (Anotace)
Jako komplexní příklad uložení metody a jeho parametrů do grafu nám poslouží následující kód.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package test_package; import java.io.IOException; public class test_metoda <T> { public synchronized strictfp String metoda(T par) throws Exception{ double d; if (par instanceof String){ }else{ throw new Exception(); } try{ d = 3/0; }catch(Exception e){ // ... } return ""; } } |
Zdroje:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4