Scala – 类声明了字段和访问修饰符
发布时间:2020-12-16 18:52:59 所属栏目:安全 来源:网络整理
导读:我一直在使用 Scala进行Manifest等实验,当我通过getDeclaredFields方法访问时,我很难找到使用对象字段的方法…… 这是一个例子: class Woah(val x: String,val y: String)val w = new Woah("w_x","w_y")classOf[Woah].getDeclaredFields foreach (field = p
我一直在使用
Scala进行Manifest等实验,当我通过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(this)替换field.get(w),它显示了相同的异常.抛出的异常是: 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中的val“x”和“y”被声明为私有final,因为它们在构造函数之外使用.所以我也试过这个: class Woah(val x: String,val y: String) { def printParams = classOf[Woah].getDeclaredFields foreach { field => println(field.get(this)) } } 不幸的是,抛出了同样的异常.有没有办法让两个val公开?或者是否有可能通过另一条途径实现同一目标?我只是想访问一个类的字段值的集合. 预先感谢您的帮助! 解决方法class Woah(val x: String,val y: String) { def printParams = classOf[Woah].getDeclaredFields foreach { field => field.setAccessible(true) println(field.get(this)) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |