如何访问私人专业功能?

时间:2017-01-03 17:14:26

标签: scala

在讲义中,原始源代码如下

$(#suit).click(function(){          

    var data = {};
    data.Numpolice = $(#num).val();
    data.Raison = $(#raison).val();
    data.Tel = $(#tel).val();
    data.Email = $(#email).val();

    $.ajax({
        type: "POST",
        url: "/PoliceAssurance/",
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){
            alert(data);
        },
        failure: function(errMsg) {
            alert(errMsg);
        }
    });
});

但是,在当前的scala版本中不推荐使用sort1。

所以,我想改用insertSort。

src/library/scala/util/Sorting.scala

private val sort1 = {
   val method = scala.util.Sorting.getClass.getDeclaredMethod(”sort1”, classOf[Array[Int]], classOf[Int], classOf[Int])    
   method.setAccessible(true)
   (xs: Array[Int], offset: Int, len: Int) => {
       method.invoke(scala.util.Sorting, xs, offset.asInstanceOf[AnyRef], len.asInstanceOf[AnyRef]) 
   }
}

有可能吗?

1 个答案:

答案 0 :(得分:2)

你可以做这个反思,但不要。 不要。私有方法是私有的,有一个原因。实施可能会改变,可能会被带走,或其他任何东西。使用私有方法是一种非常糟糕的绑定形式,我们首先将它们设为私有。也就是说,我们不应该知道在一个类的私人方法的引导下发生了什么。编写这样做的代码非常脆弱和易变。

如果您真的对如何感兴趣,请继续阅读,但最好的办法是停在这里并尝试别的。

创建insertionSort方法的多个版本(每个专用类型一个)。您可以对scala.util.Sorting进行反编译,以使用正确的签名找到正确的方法。这里使用的是insertionSort$mIc$sp。然后,您可以根据需要通过反射访问它。

val sort = {
   val method = scala.util.Sorting.getClass.getDeclaredMethod("insertionSort$mIc$sp", classOf[Array[Int]], classOf[Int], classOf[Int], classOf[Ordering[Int]])
   method.setAccessible(true)
   (xs: Array[Int], offset: Int, len: Int) => {
       method.invoke(scala.util.Sorting, xs, offset.asInstanceOf[AnyRef], len.asInstanceOf[AnyRef], implicitly[Ordering[Int]])
   }
}

,不要!