We present the problem of class hierarchy complementa-
tion: given a partially known hierarchy of classes together
with subtyping constraints (“A has to be a transitive sub-
type of B”) complete the hierarchy so that it satisfies all con-
straints. The problem has immediate practical application to
the analysis of partial programs—e.g., it arises in the process
of providing a sound handling of “phantom classes” in the
Soot program analysis framework. We provide algorithms to
solve the hierarchy complementation problem in the single
inheritance and multiple inheritance settings. We also show
that the problem in a language such as Java, with single in-
heritance but multiple subtyping and distinguished class vs.
interface types, can be decomposed into separate single- and
multiple-subtyping instances. We implement our algorithms
in a tool, JPhantom, which complements partial Java byte-
code programs so that the result is guaranteed to satisfy the
Java verifier requirements. JPhantom is highly scalable and
runs in mere seconds even for large input applications and
complex constraints (with a maximum of 14s for a 19MB
binary)