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 字节码中编码,例如sealed
或 private[foo]
,或 val
。这意味着如果您掌握了 Scala 源文件的已编译 JVM 字节码,那么您可以通过非 Scala 语言与代码交互来完成 Scala 无法完成的事情。
这不是 JVM 后端特有的,您与 Scala.js 有类似甚至更明显的问题,因为这里的编译目标 (ECMAScript) 提供的表达约束的方式比 JVM 字节码更少。
但实际上,这只是一个普遍问题:我可以采用像 Haskell 一样安全和纯粹的语言,将其编译为本机代码,如果我得到编译后的二进制文件,一切安全会迷路。事实上,大多数 Haskell 编译器执行(几乎)完全类型擦除,因此实际上没有类型,编译后也没有类型约束。
我有一个用 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 字节码中编码,例如sealed
或 private[foo]
,或 val
。这意味着如果您掌握了 Scala 源文件的已编译 JVM 字节码,那么您可以通过非 Scala 语言与代码交互来完成 Scala 无法完成的事情。
这不是 JVM 后端特有的,您与 Scala.js 有类似甚至更明显的问题,因为这里的编译目标 (ECMAScript) 提供的表达约束的方式比 JVM 字节码更少。
但实际上,这只是一个普遍问题:我可以采用像 Haskell 一样安全和纯粹的语言,将其编译为本机代码,如果我得到编译后的二进制文件,一切安全会迷路。事实上,大多数 Haskell 编译器执行(几乎)完全类型擦除,因此实际上没有类型,编译后也没有类型约束。