1 2 3 4 5 6 | public class Main { public static void main(String[] args) { String hw = "Hello world"; System.out.print(hw); } } |
Analýzou čistě tohoto programu není k dispozici AST třídy String, proto je String do grafu zaznačen jako Datový typ. Datový typ není v grafu popsán více než názvem a vztahy, kdo jej využívá. Případně, pokud je využívána metoda této nemapované třídy, vytvoří se ješte vztah s informací, že tento datový typ disponuje volanou metodou.
Problém může nastat při větším množství dekompilovaných souborů, kde je analyzována třída, která využívá třídu, jež bude teprve dekompilována. Příkladem může být dekompilování souboru s kódem uvedeným výše jako prvního a následně dekompilací java/lang/String. Dekompilací prvního souboru tak vznikne datový typ String a později je při dekompilaci třídy String vytvořen vrchol String znovu. Proto je potřeba před každým vytvořením uzlu popisující libovolnou třídu (resp rozhraní, výčet prvků, generický typ nebo datový typ) vyhledat v databázi, zda již neexistuje vrchol Datový typ s totožným názvem. Jestliže je takový vrchol nalezen, je nutno veškeré vztahy překopírovat do nově vytvářeného vrcholu. Tímto bude zachována informace o použití této třídy jinými třídami či metodami.
Překopírováním vztahů může nastat situace, kdy první třída nejenže String využívá, ale dokonce používá některou z jejích metod. Potom by se vytvořil vrchol Datový typ se vztahem have_method. Tato metoda však bude popsána neúplým množstvím informací, protože jsme doposud více informací o dané metodě nezískali. Při dekompilaci java/lang/String se následně překopírují všechny vztahy včetně vztahu s metodou, kterou však budeme záhy vytvářet znovu. Zde je tedy potřeba také vyhledávat existenci již vytvářené metody. Java však umožňuje přetěžování funkcí a tedy nemůžeme vyhledávat pouze na základě názvu funkce. Zajímá nás tedy také počet a datový typ parametrů. Při porovnávání generických datových typů stačí porovnat hlavní typ a generické parametry ignorovat, neboť v tomto java kompilátory nedělají rozdíl.
Žádné komentáře:
Okomentovat