Как я могу подкласса ByteBuffer?
Таким образом, архитекторы Java NIO не создали интерфейс ByteBuffer
, а скорее ByteBuffer
class, который не является конечный класс, но он не имеет конструкторов с открытым пакетом, и поэтому он не может быть подклассифицирован за пределами его пакета. Phooey.: P
У меня есть программа, которая использует загруженные в память файлы байт-буферов (полученные через FileChannel.map()) в кучке мест, и я пытаюсь отследить неприятную ошибку, когда этот файл остается открытым, существует, по крайней мере, один ByteBuffer
, который не выделяется в сборку мусора.
Я хотел бы создать класс InstrumentedByteBuffer
, который выглядит как байтовый буфер, но украшает регулярный ByteBuffer
(или его подклассы, например MappedByteBuffer
), и отслеживает его существование (в том числе новые буферы, созданные duplicate()
и slice()
) - таким образом я могу сохранить код без изменений, который использует ByteBuffer, мне просто нужно украсить исходный буфер байта.
Есть ли способ сделать это (через отражение или прокси или что-то еще), чтобы обойти частные конструкторы? Мне не нужно отправлять это в конечный продукт, мне просто нужно временно его использовать, чтобы решить эту ошибку.
Ответы
Ответ 1
Я пытаюсь найти неприятную ошибку, в которой находится файл остается открытым, потому что есть хотя бы один ByteBuffer, который не выпущен к сборке мусора
Это не имеет смысла. Неблокированный ByteBuffer
не остановит закрытие файла. Вы лаяете здесь неправильное дерево. Однако существует известная проблема с MappedByteBuffer
, благодаря которой она никогда не собирает мусор, сохраняя файл эффективно открытым. Это действительно проблема дизайна: она известна уже много лет, но нет реального решения. Мораль не использует большие числа MappedByteBuffers
.
Ответ 2
JMockit обеспечивает удобный способ создания классного класса. Это может помочь в этом случае.
Откажитесь от методов, которые вас интересуют, и позвольте им выполнять вашу бухгалтерскую работу и затем вызвать метод исходного класса.
Ответ 3
Я не понимаю, зачем вам подкласс здесь. Почему бы не использовать АОП? AspectJ кажется идеальным для работы. Если вы действительно чувствуете амбициозность, используйте Java Instrumentation и выполните некоторую техническую обработку байтового кода: P
Ответ 4
Хм - я просто натолкнулся на это: Информационный бюллетень JavaSpecialists 168 кажется, что он может создать универсальную структуру делегирования делегаций - если бит медленный из-за отражения.
Socket использует шаблон стратегии для фактической связи, и мы можем указать нашу собственную реализацию. Таким образом, все, что нам нужно сделать, это написать нашу собственную стратегию, которая учитывает байты, текущие назад и вперед. К сожалению, стандартными реализациями стратегии являются доступ к пакетам в пакете java.net. *, Поэтому мы не можем использовать их напрямую. Мы, конечно, не можем их подклассифицировать, но мы можем назвать методы с отражением. Однако, поскольку сами классы - это доступ к пакетам, нам нужно найти объявленный конструктор, установить его, чтобы он был доступен, а затем создать его.
Ответ 5
Я думаю, что ты ошибаешься. FileChannel.map() нарушается дизайном, потому что его ограничивают 2 Гбайт кусков, и вы не можете контролировать, когда сопоставление должно получить сбор мусора. В Windows это частая причина, по которой приложение не может снова открыть сопоставленный файл.
Таким образом, вместо того, чтобы ухудшать работу с инструкцией байтового кода или подобными хаками, вы должны реорганизовать свой код, чтобы избавиться от FileChannel.map(). Следующий программист, который должен поддерживать ваш код, будет очень благодарен, если вы это сделаете.; -)