加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala protected modifier转换为java类是public

发布时间:2020-12-16 10:05:18 所属栏目:安全 来源:网络整理
导读:在 scala类中,我定义了受保护的字段和受保护的方法: TestProtected.scala: class TestProtected { protected var f = 0 protected def m = 1} 在我看来,它会将受保护的f和m转换为受java保护的字段和方法.但是当我使用jd-gui将TestProtected.class反编译为j
在 scala类中,我定义了受保护的字段和受保护的方法:

TestProtected.scala:

class TestProtected {
  protected var f = 0

  protected def m = 1
}

在我看来,它会将受保护的f和m转换为受java保护的字段和方法.但是当我使用jd-gui将TestProtected.class反编译为java文件时,结果超出了我的预期:

@ScalaSignature(bytes="...")
public class TestProtected
{
  private int f= 0;

  public int f() { return this.f; } 
  public void f$eq(int x$1) { this.f = x$1; } 
  public int m() {
    return 1;
  }
}

java文件中的f和m是公共的吗?

为什么?

谢谢!

解决方法

首先,Scala受保护与Java保护不同:

Java受保护对于相同的包和子类是可见的,Scala保护仅对子类可见,因此Scala的受保护比Java更受限制.

所以这是由JVM Level访问修饰符与Scala访问修饰符不同引起的,我们知道Scala在JVM上运行,为了在JVM上运行,它需要在JVM中生成兼容的字节码.

还有其他一些例子:

private
private[this]
private[package]

有一些关于Scala Access的参考:

Protected and private in Scala become public in Java

Scala Access

Protected Members

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读