Java类访问时的Scala可见性

时间:2016-10-19 23:18:25

标签: java scala visibility

我有一个用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将导致“这应该被隐藏”以打印

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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