我有一个用Scala编写的模块,我需要将其集成到Java Web应用程序中。除了
方法和字段这一事实外,一切都很有效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());
}
}
运行main将导致“这应该被隐藏”以打印
答案 0 :(得分:2)
无法在JVM字节码中对此约束进行编码。它由Scala编译器强制执行,但JVM和Java都不知道它。
有一些Scala功能可以用JVM字节码编码,有些则不能编码。
特别是,有一些约束不能用JVM字节码编码,例如: sealed
或private[foo]
或val
。这意味着如果你掌握了Scala源文件的已编译JVM字节码,那么你可以通过非Scala语言与代码交互来完成Scala无法做到的事情。
这不是特定于JVM后端的,因为这里的编译目标(ECMAScript)提供了比JVM字节码更少的表达约束的方法,因此Scala.js存在类似甚至更明显的问题。
但实际上,这只是一个普遍的问题:我可以使用像Haskell一样安全和纯粹的语言,将其编译为本机代码,如果我接受编译后的二进制文件,所有安全性都将丢失。实际上,大多数Haskell编译器执行(几乎)完全类型擦除,因此实际上没有类型,编译后也没有类型约束。