2016-10-19 43 views
0

我有一個用Scala編寫的模塊,我需要將它集成到Java Web應用程序中。一切都很正常,但事實上,方法和字段是通過Java類訪問Scala時的可見性

private[somepackage] 
在Scala類

似乎是從訪問Java代碼從包外。有什麼方法可以隱藏這些嗎?

編輯:例子說明發生了什麼

package my.scala.module 

class SomeClass { 
    private[scala] val myValue = "this should be hidden" 
} 


package com.something.service; 
import my.scala.module.SomeClass; 

public class MyService { 
    private static SomeClass someInstance = new SomeClass(); 

    public static void main(String[] args){ 
     System.out.println(someInstance.myValue()); 
    } 
} 

運行主要會引起「這應該是隱藏的」打印

+0

我想一個小的工作示例來顯示確切的錯誤是必需的。我還沒有遇到這個問題。 –

+0

發佈了一個作爲編輯 – aiguy

+0

http://www.ibm.com/developerworks/library/j-scala07298/顯示了您的問題的一個示例。 –

回答

2

有沒有辦法來編碼JVM字節碼此約束。它由Scala編譯器執行,但JVM和Java都不瞭解它。

有一些Scala功能可以在JVM字節碼中編碼,有些則不能。

特別是,有一些限制,它們不能被編碼在JVM字節碼中,例如, sealedprivate[foo]val。這意味着,如果您掌握了Scala源文件的已編譯的JVM字節碼,那麼您可以通過Scala不通過與代碼交互的方式來完成Scala無法完成的工作。

這不是特定於JVM後端,因爲這裏的編譯目標(ECMAScript)比JVM字節碼提供更少的表達約束的方式,所以您與Scala.js有類似甚至更明顯的問題。

但實際上,這只是一個普遍問題:我可以像Haskell那樣將語言編譯爲本地代碼,並且如果我掌握編譯後的二進制文件,所有的安全性將會丟失。實際上,大多數Haskell編譯器都執行(幾乎)完整類型的擦除,所以實際上沒有類型,編譯後也沒有類型約束。

+0

有關此問題的示例,請參見http://www.ibm.com/developerworks/library/j-scala07298/。 –