Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展ByteBuffer类_Java_Nio_Bytebuffer - Fatal编程技术网

Java 扩展ByteBuffer类

Java 扩展ByteBuffer类,java,nio,bytebuffer,Java,Nio,Bytebuffer,有没有办法创建扩展ByteBuffer类的类 ByteBuffer中的一些抽象方法是包私有的,如果我创建包java.nio,就会引发安全异常 出于性能原因,我希望这样做——例如getInt有大约10个方法调用,以及相当多的if。即使所有的检查都被保留,并且只有方法调用被内联,并且大/小尾端检查被删除,我创建的测试表明它可以快4倍左右。ByteBuffer是抽象的,所以,是的,您可以扩展它。。。但我认为您想要做的是扩展实际实例化的类,而您可能无法扩展。也可能是得到实例化的特定方法重写了该方法,使其

有没有办法创建扩展ByteBuffer类的类

ByteBuffer中的一些抽象方法是包私有的,如果我创建包java.nio,就会引发安全异常


出于性能原因,我希望这样做——例如getInt有大约10个方法调用,以及相当多的if。即使所有的检查都被保留,并且只有方法调用被内联,并且大/小尾端检查被删除,我创建的测试表明它可以快4倍左右。

ByteBuffer是抽象的,所以,是的,您可以扩展它。。。但我认为您想要做的是扩展实际实例化的类,而您可能无法扩展。也可能是得到实例化的特定方法重写了该方法,使其比ByteBuffer中的方法更有效

我还想说的是,对于所有这些需求,您可能总体上是错的——可能不是因为您正在测试什么,但代码可能是有原因的(可能是在其他平台上)

如果你真的相信你是对的,打开一个窗口,看看他们有什么要说的


如果您想添加到nio包中,可以在调用Java时尝试设置引导类路径。它应该允许您将类放在rt.jar类之前。键入java-X查看如何做到这一点,您需要-Xbootclasspath/p开关。

您可以通过使用反射来忽略保护级别,但这在很大程度上违背了性能目标

您不能在java.nio包中创建类——这样做(并以任何方式分发结果)违反了Sun的java许可证,理论上可能会让您陷入法律纠纷

我不认为有一种方法可以做你想做的事情,而不去本土——但我也怀疑你正屈服于过早优化的诱惑。假设您的测试是正确的(微基准通常不是):您真的确定访问ByteBuffer将成为实际应用程序的性能瓶颈吗?当你的应用程序只花费5%的时间在那里,95%的时间在处理获取的数据时,ByteBuffer.get()是否能快4倍,这有点无关紧要

为了(可能纯粹是理论上的)性能而想绕过所有检查听起来不是个好主意。性能调优的基本规则是“首先使其正确工作,然后使其工作得更快”

编辑:如果,如评论中所述,应用程序实际上花费了20-40%的时间在ByteBuffer方法上,并且测试是正确的,这意味着15-30%的加速潜力是显著的,但我不值得开始使用JNI或干扰API源。我会先尝试用尽所有其他选项:

  • 您正在使用服务器虚拟机吗
  • 该应用程序是否可以进行修改,以减少对ByteBuffer的呼叫,而不是试图加快它的呼叫速度
  • 使用探查器查看调用来自何处-可能有些根本不需要
  • 也许可以修改算法,或者使用某种缓存

+50悬赏以规避访问限制(tt不能 完成了单独使用反射。也许 有一种方法可以使用sun.misc.Unsafe 等等?)

答案是:在Java中没有办法绕过所有访问限制

  • sun.misc.Unsafe
    在安全管理人员的授权下工作,因此不会有任何帮助
  • 正如萨纳姆所说:

ByteBuffer的包是私有的 抽象的集合和获取方法,所以 无法覆盖它。还有所有的 构造函数是包私有的,所以 你不能给他们打电话

  • 反射允许您绕过许多内容,但前提是安全管理器允许。在许多情况下,您无法控制安全管理器,这是强加给您的。如果您的代码依赖于摆弄安全管理器,那么可以说,它在所有情况下都不是“可移植”的或可执行的
问题的底线是,试图覆盖字节缓冲区并不能解决问题


除了使用所需的方法自己实现类之外,没有其他选择。尽可能使方法最终化将有助于编译器执行优化(减少为运行时多态性和内联生成代码的需要)。

您不能扩展ByteBuffer,感谢上帝

您不能扩展b/c,因为没有受保护的c-TOR。为什么谢天谢地?好的,只有2个真正的子类可以确保JVM可以大量优化任何涉及ByteBuffer的代码

最后,如果您需要为real扩展该类,请编辑字节码,只需将受保护属性c-tor和public属性添加到DirectByteBuffer(和DirectByteBuffer)。扩展HeapBuffer没有任何用途,因为您可以通过任何方式访问底层数组

使用
-Xbootclasspath/p
并在那里添加您自己的类,在您需要的包中进行扩展(在java.nio之外)。就是这样做的

另一种方法是使用sun.misc.Unsafe,在
address()
之后直接访问内存

我想为你这样做 性能原因-getInt for 这个例子有大约10种方法 调用,以及许多 如果是的话。即使所有支票都已结清 只有方法调用是内联的,并且 删除大/小端点检查, 我创建的测试表明 可以快4倍左右

现在好的方面是,使用gdb并检查真正生成的机器代码,您会惊讶地发现有多少检查会被删除

我无法想象为什么一个人想要扩展这些类。它们的存在是为了实现良好的性能,而不仅仅是OO变形执行


编辑:

如何声明任何类并绕过Java验证器 On Unsafe:Unsafe有两个方法绕过验证器,如果您有一个扩展字节的类
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);
int totalLength = numberOfIntsInBuffer;
ByteBuffer myBuffer = whateverMyBufferIsCalled;
int[] block = new int[1024];
IntBuffer intBuff = myBuffer.asIntBuffer();
int partialLength = totalLength/1024;

//Handle big blocks of 1024 ints at a time
try{
  for (int i = 0; i < partialLength; i++) {
     intBuff.get(block);
     // Do processing on ints, w00t!
  }

  partialLength = totalLength % 1024; //modulo to get remainder
  if (partialLength > 0) {
    intBuff.get(block,0,partialLength);
    //Do final processing on ints
  }
} catch BufferUnderFlowException bufo {
   //well, dang!
}