во-первых, можно использовать JVMTI и использовать хот релоад классов в JVM по отладочному протоколу. Это делает IDE, когда ты просишь добавить кода без перезапуска приложения
во-вторых можно использовать JavaCompiler (Java) или Roslyn (C#), чтобы в рантайме взять код класса, добавить в него нужный патч как в исходник, перекомпилировать и зарелоадить класс в новый класслоадер.
во-третьих, можно использовать Spring с BeanPostProcessor-ами и ReloadableContext. В спринге если что можно контексты перезапускать, и даже писать свои собственные. Ты перезапускаешь контекст приложения, берешь тот же самый базовый объект-бин, но обобрачиваешь его другим набором динамичеких проксей, где будут новые методы. Всё заново autowire-ится, конечно - долгая и неприятная процедура. Тут это получается не совсем класс, а "система, ведущая себя как будто бы класс изменился" - то есть, скорее архитектурное решение
как старый код будет использовать новый класс? Ну так он будет вначале резолвить и кэшировать ссылки на него через регистри, на манер OSGi.
можно сам OSGi кстати заюзать. Или что-то такое