src/Pure/General/untyped.scala
author wenzelm
Thu, 07 Jul 2016 11:46:18 +0200
changeset 63419 f473b6b16c63
parent 59080 611914621edb
child 64370 865b39487b5d
permissions -rw-r--r--
more operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/untyped.scala
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     2
    Module:     PIDE
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     4
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     5
Untyped, unscoped, unchecked access to JVM objects.
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     6
*/
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     7
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     8
package isabelle
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     9
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    10
63419
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    11
import java.lang.reflect.{Method, Field}
59080
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    12
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    13
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    14
object Untyped
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    15
{
59080
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    16
  def method(c: Class[_], name: String, arg_types: Class[_]*): Method =
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    17
  {
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    18
    val m = c.getDeclaredMethod(name, arg_types: _*)
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    19
    m.setAccessible(true)
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    20
    m
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    21
  }
611914621edb added Untyped.method convenience (for *this* class only);
wenzelm
parents: 59079
diff changeset
    22
58682
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    23
  def classes(obj: AnyRef): Iterator[Class[_ <: AnyRef]] = new Iterator[Class[_ <: AnyRef]] {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    24
    private var next_elem: Class[_ <: AnyRef] = obj.getClass
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    25
    def hasNext(): Boolean = next_elem != null
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    26
    def next(): Class[_ <: AnyRef] = {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    27
      val c = next_elem
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    28
      next_elem = c.getSuperclass.asInstanceOf[Class[_ <: AnyRef]]
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    29
      c
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    30
    }
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    31
  }
58682
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    32
63419
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    33
  def field(obj: AnyRef, x: String): Field =
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    34
  {
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    35
    val iterator =
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    36
      for {
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    37
        c <- classes(obj)
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    38
        field <- c.getDeclaredFields.iterator
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    39
        if field.getName == x
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    40
      } yield {
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    41
        field.setAccessible(true)
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    42
        field
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    43
      }
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    44
    if (iterator.hasNext) iterator.next
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    45
    else error("No field " + quote(x) + " for " + obj)
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    46
  }
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    47
59079
12a689755c3d tuned signature -- more explicit types;
wenzelm
parents: 58682
diff changeset
    48
  def get[A](obj: AnyRef, x: String): A =
12a689755c3d tuned signature -- more explicit types;
wenzelm
parents: 58682
diff changeset
    49
    if (obj == null) null.asInstanceOf[A]
63419
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    50
    else field(obj, x).get(obj).asInstanceOf[A]
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    51
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    52
  def set[A](obj: AnyRef, x: String, y: A): Unit =
f473b6b16c63 more operations;
wenzelm
parents: 59080
diff changeset
    53
    field(obj, x).set(obj, y)
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    54
}