Самое близкое к этому с Java это Instrumentation . В основном вы пишете некоторые классы Java, которым присваивается серия байтов, которые определяют класс, перебираете байтовый код и возвращаете модифицированный байтовый массив файла класса. Затем вы упаковываете эти классы в файл JAR и указываете JVM использовать их либо в командной строке, либо помещая атрибут в файл манифеста файла JAR инструментария.
Конечно, если вы сделаете это, вы захотите использовать некоторую библиотеку манипулирования байтовым кодом, такую как ASM .
EDIT : Если интересующий вас класс реализует интерфейсы, вы можете взглянуть на динамические прокси-классы через java.lang.reflect.Proxy . Это имеет тот недостаток, что части кода, которые вы не написали и которые выполняют new ClassOfInterest()
, не затрагиваются, но имеют следующие преимущества:
- Быть намного проще, чем модифицировать байт-код классов.
- Вы можете динамически выбирать, чтобы разные экземпляры прокси действовали так, как будто они имеют разные суперклассы.
- Вам не нужно беспокоиться о
SecurityManager
проблемах.