  Software developers must often replace existing components in their systems
to adapt to evolving environments or tooling. While traditional code search
systems are effective at retrieving components with related functionality, it
is much more challenging to retrieve components that can be used to directly
replace existing functionality, as replacements must account for more
fundamental program properties such as type compatibility. To address this
problem, we introduce ClassFinder, a system which given a query class Q, and a
search corpus S, returns a ranked subset of classes that can replace Q and its
functionality. ClassFinder produces afield and method mapping between the
classes that can provide useful hints to a developer and can be used to
effectively refine the ranking of candidate replacement classes. Our technique
leverages the complementary strengths of a distributed embeddings-based search
and type-based analysis, using the former to prune down candidates for an
optimization-based approach based on the latter. ClassFinder retrieves
replacement classes, along with a type-aware field/method mapping between
classes. We evaluate ClassFinder on a search space of ~600thousand open
sourceJava classes. Querying ClassFinder with 24 known Java classes provided
meaningful replacement classes and mappings, in many cases producing complete
mappings with functionally identical replacement classes.
