【问题标题】:Scala visibility when accessed by Java classes由 Java 类访问时的 Scala 可见性
【发布时间】:2017-03-01 18:44:16
【问题描述】:

我有一个用 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”

【问题讨论】:

标签: java scala visibility


【解决方案1】:

没有办法在 JVM 字节码中编码这个约束。它由 Scala 编译器强制执行,但 JVM 和 Java 都不知道它。

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

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

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

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

【讨论】:

猜你喜欢
  • 2011-02-17
  • 2011-03-02
  • 2023-03-11
  • 2019-04-30
  • 2010-09-21
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多