+import org.opalj.collection.immutable._; import org.opalj.br._ ; import org.opalj.br.analyses._; import org.opalj.br.instructions._; import org.opalj.collection.immutable.ConstArray.find; import org.opalj.util.PerformanceEvaluation.time
+//val p = Project(org.opalj.bytecode.RTJar)
+ val p = Project(org.opalj.bytecode.JRELibraryFolder)
+p.allFields.count(_.isFinal)
+p.allFields.count(_.isStatic)
+p.allFields.count(f => f.isStatic && f.isFinal)
+val fieldAccesses = p.get(FieldAccessInformationKey)
+val nonFinalFields = p.allFields.filter(f => !f.isFinal).toSet
+val finalFields = p.allFields.filter(f => f.isFinal).toSet
+// fields which are read multiple times (potentially across multiple methods)
+nonFinalFields.filter{ff => fieldAccesses.allReadAccesses.get(ff).map(_.size).getOrElse(0) > 1 }
+// fields which are read multiple times in the same method
+nonFinalFields.filter{ff =>
+ fieldAccesses.allReadAccesses.get(ff).map(_.size).getOrElse(0) > 1 &&
+ fieldAccesses.allReadAccesses(ff).map(_._1).toSet.size < fieldAccesses.allReadAccesses(ff).map(_._1).size
+// fields which are read and written in the same method
+nonFinalFields.filter{ff =>
+ fieldAccesses.allReadAccesses.get(ff).toSeq.flatMap(_.map(_._1)).toSet.intersect(
+ fieldAccesses.allWriteAccesses.get(ff).toSeq.flatMap(_.map(_._1)).toSet