Вы не можете расширить ByteBuffer и благодарить Бога за.
Вы не можете продлить б / у, защищенных c-торов нет. Почему слава богу часть? Хорошо, наличие только 2 реальных подклассов гарантирует, что JVM может тяжело оптимизировать любой код, включающий ByteBuffer.
Наконец, если вам нужно расширить класс по-настоящему, отредактируйте байт-код и просто добавьте защищенный атрибут c-tor и открытый атрибут в DirectByteBuffer (и DirectByteBufferR). Расширение HeapBuffer не имеет никакой цели, поскольку вы в любом случае можете получить доступ к базовому массиву
используйте -Xbootclasspath/p
и добавляйте туда свои собственные классы, расширяйте их в нужном вам пакете (за пределами java.nio). Вот как это делается.
Другой способ - использовать sun.misc.Unsafe и делать все, что вам нужно, с прямым доступом к памяти после address()
.
Я бы хотел сделать это для
причины производительности - getInt для
Пример имеет около 10 методов
вызовы, а также немало
если х. Даже если все чеки оставлены, и
только вызовы методов являются встроенными и
большие / маленькие порядковые чеки удалены,
тесты, которые я создал, показывают, что это
может быть примерно в 4 раза быстрее.
Теперь хорошая часть, используйте gdb и проверьте действительно сгенерированный машинный код, вы будете удивлены, сколько проверок будет удалено.
Я не могу себе представить, почему человек хочет продлить занятия. Они существуют для обеспечения хорошей производительности, а не только для выполнения OO полиморфа.
редактирование:
Как объявить любой класс и обойти Java-верификатор
On Unsafe: Unsafe имеет 2 метода, которые обходят верификатор, и если у вас есть класс, расширяющий ByteBuffer, вы можете просто вызвать любой из них. Вам нужна взломанная версия (но это очень просто) ByteBuffer с открытым доступом и защищенным c-tor только для компилятора.
Методы ниже. Вы можете использовать их на свой страх и риск. После того, как вы объявите класс таким образом, вы даже сможете использовать его с новым ключевым словом (при условии, что есть подходящий c-tor)
public native Class defineClass(String name, byte[] b, int off, int len, ClassLoader loader, ProtectionDomain protectionDomain);
public native Class defineClass(String name, byte[] b, int off, int len);