首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用反射与java.math.BigInteger接口时,我必须预料到哪些问题?

在使用反射与java.math.BigInteger接口时,我必须预料到哪些问题?
EN

Stack Overflow用户
提问于 2012-04-07 21:06:32
回答 1查看 440关注 0票数 5

我正在实现一个更快的BigInt实现,我不确定我应该在多大程度上提供与底层平台的互操作。

现在,BigInt只包装了一个BigInteger,值bigInteger只返回包装后的值:

代码语言:javascript
运行
复制
class BigInt(val bigInteger: BigInteger) ...

因为我没有包装Java类型,所以我必须这样做

代码语言:javascript
运行
复制
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])
  }
...
}

这会带来麻烦吗?或者有更好的方法吗?

EN

Stack Overflow用户

回答已采纳

发布于 2012-04-07 23:14:12

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

代码语言:javascript
运行
复制
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时都要为它支付大部分费用。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10054757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档