Java 类 访问时的 Scala 可见性

Scala visibility when accessed by Java classes

我有一个用 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 将导致 "this should be hidden" 打印

无法在 JVM 字节码中对此约束进行编码。它由 Scala 编译器强制执行,但 JVM 和 Java 都不知道。

有些 Scala 特性可以用 JVM 字节码编码,有些则不能。

特别是,有一些约束不能在 JVM 字节码中编码,例如sealedprivate[foo],或 val。这意味着如果您掌握了 Scala 源文件的已编译 JVM 字节码,那么您可以通过非 Scala 语言与代码交互来完成 Scala 无法完成的事情。

这不是 JVM 后端特有的,您与 Scala.js 有类似甚至更明显的问题,因为这里的编译目标 (ECMAScript) 提供的表达约束的方式比 JVM 字节码更少。

但实际上,这只是一个普遍问题:我可以采用像 Haskell 一样安全和纯粹的语言,将其编译为本机代码,如果我得到编译后的二进制文件,一切安全会迷路。事实上,大多数 Haskell 编译器执行(几乎)完全类型擦除,因此实际上没有类型,编译后也没有类型约束。