gpt4 book ai didi

java - Java 类访问时的 Scala 可见性

转载 作者:行者123 更新时间:2023-12-02 03:17:03 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

关于java - Java 类访问时的 Scala 可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com