gpt4 book ai didi

Scala——类声明字段和访问修饰符

转载 作者:行者123 更新时间:2023-12-04 10:29:40 24 4
gpt4 key购买 nike

我一直在尝试在 Scala 中使用 Manifests 等,当通过 getDeclaredFields 方法访问时,我很难找到一种使用对象字段的方法......

这是一个例子:

class Woah(val x: String, val y: String)

val w = new Woah("w_x", "w_y")
classOf[Woah].getDeclaredFields foreach (field => println(field.get(w))

我尝试了许多变体,例如在 Woah 类中创建一个方法,该方法执行与第三行代码相同的操作,但将 field.get(w) 替换为 field.get(this),它显示相同的异常.抛出的异常是:
java.lang.IllegalAccessException: Class Fun$Woah$$anonfun$1 can not access a member of class Fun$Woah with modifiers "private final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Field.doSecurityCheck(Field.java:960)
at java.lang.reflect.Field.getFieldAccessor(Field.java:896)
at java.lang.reflect.Field.get(Field.java:358)
at Fun$Woah$$anonfun$1.apply(Fun.scala:17)
at Fun$Woah$$anonfun$1.apply(Fun.scala:17)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:35)
at Fun$Woah.<init>(Fun.scala:17)
at Fun$.main(Fun.scala:20)
at Fun.main(Fun.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:81)
at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:86)
at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:81)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:86)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:83)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

我做了尽可能多的搜索,目前我没有找到任何新的想法。据我所知,Woah 类中的“x”和“y”被声明为私有(private) final,因为它们在构造函数之外使用。所以我也试过这个:
class Woah(val x: String, val y: String) {
def printParams = classOf[Woah].getDeclaredFields foreach { field =>
println(field.get(this))
}
}

不幸的是,抛出了同样的异常。有没有办法让这两个 vals 公开?或者是否有可能通过其他途径实现相同的目标?我只是对访问类字段值的集合感兴趣。

预先感谢您的帮助!

最佳答案

class Woah(val x: String, val y: String) {
def printParams = classOf[Woah].getDeclaredFields foreach { field =>
field.setAccessible(true)
println(field.get(this))
}
}

关于Scala——类声明字段和访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6756442/

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