saxon:object-map
Converts a Java external object to a map, giving access to the instance methods of the object as dynamic functions.
object-map($object as jt:java.lang.Object) ➔ map(xs:string, function(*))
Arguments | |||
| $object | jt:java.lang.Object | The supplied external object |
Result | map(xs:string, function(*)) |
Namespace
http://saxon.sf.net/
Notes on the Saxon implementation
Available since Saxon 9.9.
Details
The map returned by the function is as follows:
- There is one entry named "this" whose value is a zero-arity function that returns
$object
. - For each non-static public method defined on the object's class, provided the name of the method is unique, there will be an entry whose key is the method name, and whose value is a (dynamic) function corresponding to the method. The arguments expected by the function correspond to the arguments declared for the method, and the result returned by the function similarly corresponds to the result of the method.
- For each non-static public method defined on the object's class, provided the
combination of the method's name and arity is unique, there will be an entry whose key has
the form
MMM_N
whereMMM
is the method name, andN
is the arity: for example if the object were an instance ofjava.lang.String
, there would be an entry with keysplit_1
and another with keysplit_2
corresponding to the two versions of theString.split()
method. There would be no entry forreplace_2
because there are two arity-2 methods namedreplace
.
The type conversions for the arguments and return values of the dynamic functions work in the same way
as for other reflexive extension functions: see Converting Arguments.
The void=this
convention is used: that is, a Java method whose declared return type is void
is translated to a function that returns the target object as its result, to make it easier to write code that
uses function chaining.
This function is called implicitly when an external object appears as the left-hand operand of the
lookup operator "?". This means that, for example, Q{java:java.util.Locale}new("en")?getDisplayLanguage_0()
returns the string "English"
.
For more complex use cases, the function can be called explicitly. For example, this query:
declare namespace StreamSource = "java:javax.xml.transform.stream.StreamSource"; declare namespace map = "http://www.w3.org/2005/xpath-functions/map"; StreamSource:new() => saxon:object-map() => map:keys() => sort()produces:
"equals", "equals_1", "getClass", "getClass_0", "getInputStream", "getInputStream_0", "getPublicId", "getPublicId_0", "getReader", "getReader_0", "getSystemId", "getSystemId_0", "hashCode", "hashCode_0", "notify", "notifyAll", "notifyAll_0", "notify_0", "setInputStream", "setInputStream_1", "setPublicId", "setPublicId_1", "setReader", "setReader_1", "this", "toString", "toString_0", "wait_0", "wait_1", "wait_2"