sig
  external make : 'a java_constructor -> 'a = "java constructor"
  external make_array : 'a java_array_shape -> 'a = "java make array"
  external make_array_dims : 'a java_array_shape_dims -> 'a
    = "java make array dims"
  external call : 'a java_method_call -> 'a = "java method call"
  external exec : 'a java_method_exec -> 'a = "java method exec"
  external chain : 'a java_method_chain -> 'a = "java method chain"
  external get : 'a java_field_get -> 'a = "java field get"
  external set : 'a java_field_set -> 'a = "java field set"
  external iter :
    'a java_reference_type ->
    ('-> unit) -> java'util'Iterator java_extends -> unit = "java iter"
  external fold :
    'a java_reference_type ->
    ('-> '-> 'b) -> '-> java'util'Iterator java_extends -> 'b
    = "java fold"
  val null : 'a java_instance
  external is_null : 'a java_instance -> bool = "java is_null"
  external is_not_null : 'a java_instance -> bool = "java is_not_null"
  external equal : 'a java_instance -> 'b java_instance -> bool = "java =="
  external not_equal : 'a java_instance -> 'b java_instance -> bool
    = "java !="
  external instanceof : 'a java_reference_type -> 'b java_instance -> bool
    = "java instanceof"
  external cast : 'a java_reference_type -> 'b java_instance -> 'a
    = "java cast"
  external get_class : 'a java_any_type -> java'lang'Class java_instance
    = "java class"
  external throw : java'lang'Throwable java_extends -> 'a = "java throw"
  external synchronized : 'a java_instance -> (unit -> unit) -> unit
    = "java synchronized"
  external proxy_loader :
    'a java_proxy -> java'lang'ClassLoader java_extends -> 'a
    = "java proxy loader"
  external proxy_system : 'a java_proxy -> 'a = "java proxy system"
  external proxy_runtime : 'a java_proxy -> 'a = "java proxy runtime"
  external proxy : 'a java_proxy -> 'a = "java proxy system"
  val wrap : 'a java_instance -> 'a java_instance option
  val unwrap : 'a java_instance option -> 'a java_instance
end