java - 使用反射与 java.math.BigInteger 交互时,我会遇到哪些问题?

标签 java scala math reflection biginteger

我正在实现一个更快的 BigInt 实现,但我不确定我应该走多远才能提供与底层平台的互操作。

今天 BigInt 只是包装了一个 BigInteger 而值 bigInteger 只是返回包装后的值:

class BigInt(val bigInteger: BigInteger) ...

因为我没有包装 Java 类型,所以我必须做类似的事情

final class BigInt private(final val signum: Int,
                           final private[math] val arr: Array[Int])
  def bigInteger: java.math.BigInteger = {
    // Avoid copying of potentially large arrays.
    val ctor = classOf[java.math.BigInteger]
                 .getDeclaredConstructor(classOf[Array[Int]], classOf[Int])
    ctor setAccessible true
    ctor.newInstance(arr, signum.asInstanceOf[Object])
  }
...
}

这会造成麻烦还是有更好的方法?

最佳答案

一般来说,当我看到人们使用像这样的私有(private)(或其他未记录的)构造函数或方法时,他们会捕获 NoSuchMethodException 并提供替代方案:

object BigInt {
  import java.math.BigInteger

  private val toBigInteger: (Array[Int], Int) => BigInteger = try {
    val ctor = classOf[BigInteger].getDeclaredConstructor(
      classOf[Array[Int]], classOf[Int]
    )
    ctor.setAccessible(true)

    (arr, signum) => ctor.newInstance(arr, signum.asInstanceOf[Object])
  } catch { case _: NoSuchMethodException =>
    (arr, signum) =>
      val buffer = java.nio.ByteBuffer.allocate(arr.length * 4)
      buffer.asIntBuffer.put(arr)
      new BigInteger(signum, buffer.array)
  }
}

final class BigInt(final val signum: Int, final val arr: Array[Int]) {
  def bigInteger = BigInt.toBigInteger(arr, signum)
}

我还将反射业务移到了伴生对象上,以避免每次调用 bigInteger 时都需要支付大部分费用。

关于java - 使用反射与 java.math.BigInteger 交互时,我会遇到哪些问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10054757/

相关文章:

java - 如何使我的方法接受 x 个参数

java - 使用java从流式api将推文存储在mysql中

java - 无法替换Java字符串中的标点符号

scala - 如何在 Scala 2.9.0 中覆盖 Iterable.flatMap?

scala - "Better"Scala 堆栈跟踪

.net - 绘制曲线和创建 JPEG 的最佳平台

java - Tomcat JDCBRealm 找不到驱动程序类

Java :How Generic Erasure Works

scala - 使用 foldRight 反转列表的优雅方法?

JavaScript 计算数字