Подтвердить что ты не робот

Как я могу подкласса ByteBuffer?

Таким образом, архитекторы Java NIO не создали интерфейс ByteBuffer, а скорее ByteBuffer class, который не является конечный класс, но он не имеет конструкторов с открытым пакетом, и поэтому он не может быть подклассифицирован за пределами его пакета. Phooey.: P

У меня есть программа, которая использует загруженные в память файлы байт-буферов (полученные через FileChannel.map()) в кучке мест, и я пытаюсь отследить неприятную ошибку, когда этот файл остается открытым, существует, по крайней мере, один ByteBuffer, который не выделяется в сборку мусора.

Я хотел бы создать класс InstrumentedByteBuffer, который выглядит как байтовый буфер, но украшает регулярный ByteBuffer (или его подклассы, например MappedByteBuffer), и отслеживает его существование (в том числе новые буферы, созданные duplicate() и slice()) - таким образом я могу сохранить код без изменений, который использует ByteBuffer, мне просто нужно украсить исходный буфер байта.

Есть ли способ сделать это (через отражение или прокси или что-то еще), чтобы обойти частные конструкторы? Мне не нужно отправлять это в конечный продукт, мне просто нужно временно его использовать, чтобы решить эту ошибку.

4b9b3361

Ответ 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(). Следующий программист, который должен поддерживать ваш код, будет очень благодарен, если вы это сделаете.; -)