with and within methods for Java objects and class names
with.RdConvenience wrapper that allow calling methods of Java object and classes from within the object (or class).
Usage
# S3 method for class 'jobjRef'
with(data, expr, ...)
# S3 method for class 'jobjRef'
within(data, expr, ...)
# S3 method for class 'jarrayRef'
with(data, expr, ...)
# S3 method for class 'jarrayRef'
within(data, expr, ...)
# S3 method for class 'jclassName'
with(data, expr, ...)
# S3 method for class 'jclassName'
within(data, expr, ...)Arguments
- data
A Java object reference or a java class name. See
J- expr
R expression to evaluate
- ...
ignored
Details
The expression is evaluated in an environment that contains a mapping between the public fields and methods of the object.
The methods of the object are mapped to standard R functions in the environment. In case of classes, only static methods are used.
The fields of the object are mapped to active bindings (see makeActiveBinding) so that they can be accessed and modified from within the environment. For classes, only static fields are used.
References
the java.lang.reflect package:
https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/package-summary.html
Examples
#> Error in .jcheck(): java.lang.NoClassDefFoundError: RJavaArrayTools.jcall("java/lang/System", "S", "getProperty", "java.class.path")new("jobjRef", jobj = <pointer: 0x590bf6c97f02>, jclass = "java/lang/NoClassDefFoundError")
if (!nzchar(Sys.getenv("NOAWT"))) {
p <- .jnew( "java/awt/Point", 0L, 0L )
with( p, {
# x and y and now 0
move( 10L, 10L )
# x and y are now 10
x <- x + y
} )
f <- within( .jnew( "javax/swing/JFrame" ) , {
layout <- .jnew( "java/awt/BorderLayout" )
setLayout( layout )
add( .jnew( "javax/swing/JLabel", "north" ), layout$NORTH )
add( .jnew( "javax/swing/JLabel", "south" ), layout$SOUTH )
add( .jnew( "javax/swing/JLabel", "west" ), layout$WEST )
add( .jnew( "javax/swing/JLabel", "east" ), layout$EAST )
setSize( .jnew( "java/awt/Dimension", 400L, 400L ) )
setVisible( TRUE )
} )
}
#> Error in .jcheck(): java.lang.NoClassDefFoundError: RJavaTools.jcall(x, target, get_method, object)new("jobjRef", jobj = <pointer: 0x590bf7fe1692>, jclass = "java/lang/NoClassDefFoundError")
Double <- J("java.lang.Double")
with( Double, MIN_VALUE )
#> Error in .jcall("RJavaTools", "[Ljava/lang/reflect/Field;", "getStaticFields", clazz): RcallMethod: cannot determine object class
with( Double, parseDouble( "10.2" ) )
#> Error in .jcheck(): java.lang.NoClassDefFoundError: RJavaTools.jcall("RJavaTools", "[Ljava/lang/reflect/Field;", "getStaticFields", clazz)new("jobjRef", jobj = <pointer: 0x590bf7fe16a2>, jclass = "java/lang/NoClassDefFoundError")
if (FALSE) { # \dontrun{
# inner class example
HashMap <- J("java.util.HashMap")
with( HashMap, new( SimpleEntry, "key", "value" ) )
with( HashMap, SimpleEntry )
} # }
with( J("java.lang.System"), getProperty("java.home") )
#> Error in .jcall("RJavaTools", "[Ljava/lang/reflect/Field;", "getStaticFields", clazz): RcallMethod: cannot determine object class
#> Error in .jcheck(): java.lang.NoClassDefFoundError: RJavaTools.jcall("RJavaTools", "[Ljava/lang/reflect/Field;", "getStaticFields", clazz)new("jobjRef", jobj = <pointer: 0x590bf7fe16b2>, jclass = "java/lang/NoClassDefFoundError")