Проверьте AspectJ.Он предоставляет API более высокого уровня для того, что вы собираетесь делать.
Другая возможность - использование обычных инструментов.Например, сокеты создаются через SocketFactory, который можно заменить, вызвав специальный статический метод.Таким образом, вы можете заменить настоящий сокет своим собственным и получить доступ к каждому байту, переданному через сокет.Хотя я внедрил прототип такой системы около 6-7 лет назад, я не помню наизусть все детали.Я верю, что вы можете исследовать их самостоятельно.Но подход AspectJ проще (ИМХО).