Working with Java Arrays
Description
It's always been possible to interact with
Java array objects in BBj using Java Array reflection:
use java.awt.Color
use java.lang.reflect.Array
color! = Array.newInstance(Class.forName("java.awt.Color"),2) Array.set(color!,0,Color.RED)
Array.set(color!,1,Color.BLUE)
print "color![0]=",Array.get(color!,0)
print "color![1]=",Array.get(color!,1)
|
In BBj 18.00 and higher, this functionality
can be expressed in a more natural syntax:
use java.awt.Color
declare Color[] Color!
color! = new Color[2]
color![0] = Color.RED
color![1] = Color.BLUE
print "color![0]=",color![0]
print "color![1]=",color![1]
|
It's legal (but strongly discouraged) for
a traditional BBj object array X![]and a Java array object X!to coexist.
The syntax for referencing Java array elements is identical to the syntax
for referencing BBj array elements, and in the event of a conflict, the
traditional BBj array always wins, hiding the Java array object. (The
Java array object can always be accessed using the reflection strategy
described at the beginning of this page, but it's preferable to avoid
conflicting variable names.)
READY
>/
rem ' Resolving conflicting BBj and Java array references
data "Java","object","array","x!"
print "Create Java array x!"
x! = new Object[4]
dread x![]
print "x![0]=",x![0]
data "BBj","object","array","x![]"
print "Create BBj array x![]"
dim x![0:3]
dread x![]
print "x![0]=",x![0]
dump (0,mode="vars")
print "Clear BBj array x![]"
clear x![]
print "x![0]=",x![0]
print "Clear Java array x!"
clear x!
print "x![0]=",x![0]
stop
>run
Create Java array x!
x![0]=Java
Create BBj array x![]
x![0]=BBj
****** LEVEL 0, PGM=dup.txt
x! (java.lang.Object[]) has 4 elements
[0] len=4
1: "Java" $4A617661$
[1] len=6
1: "object" $6F626A6563 74$
[2] len=5
1: "array" $6172726179$
[3] len=2
1: "x!" $7821$
x![] has 4 elements [3]
[0] len=3
1: "BBj" $42426A$
[1] len=6
1: "object" $6F626A6563 74$
[2] len=5
1: "array" $6172726179$
[3] len=4
1: "x![]" $78215B5D$
Clear BBj array x![]
x![0]=Java
Clear Java array x!
!ERROR=42 (Array is not defined)
[18] print "x![0]=",x![0]
READY
>
|
Java primitive and object arrays can be
defined on the server or client.
READY
>/
declare int[] i!
i! = new int[2]
print i!.getClass().getTypeName(),i!.length
i![1] = 42
declare Double[] d!
d! = new Double[3]
print d!.getClass().getTypeName(),d!.length
d![1] = Math.PI
declare byte@[] b!
b! = new byte@[4]
print b!.getClass().getTypeName(),b!.length
b![2] = 127
dump (0,mode="vars")
>run
int[] 2
java.lang.Double[] 3
byte[] 4
****** LEVEL 0, PGM=arrays.txt
i! (int[]) has 2 elements
[0] = 0
[1] = 42
d! (java.lang.Double[]) has 3 elements
[0] = null
[1] java.lang.Double
1: "3.141592653589793" $332E313431 3539323635 3335383937 3933$
[2] = null
b! (byte@[]) has 4 elements
[0] = 0
[1] = 0
[2] = 127
[3] = 0
READY
>
|
When interacting with Java array elements,
primitive types are converted as described in Calling
Java From BBj.
READY
>x! = new int[10]
>x![1] = 5
>x![2] = 3.2
!ERROR=26 (3.2 could not be converted to int)
>x! = new boolean[10]
>x![1] = 0
>x![2] = 1
>x![3] = Boolean.TRUE
>x![4] = "oops"
!ERROR=42 (argument type mismatch)
>x! = new Boolean[10]
>x![1] = 0
!ERROR=42 (array element type mismatch)
>x![1] = Boolean.TRUE
>x![2] = Boolean.FALSE
>
|
Most references to array![]or array![all] will resolve to the traditional BBj array
if one exists by that name, otherwise the interpreter will look for a
Java array object. Some references require that you specify one or the
other. The first such case is the DIMS()function:
READY
>/
begin
dim
dims$:"dimensions:i(1),dim0elem:i(4),dim0base:i(4),dim1elem:i(4),dim1base:i(4),dim2
elem:i(4),dim2base:i(4)"
print "Java Array (x! = new String[5]): dims(x!)"
restore 0
x! = new String[5]
dread x![]
dims$ = dims(x!)
gosub dims
print "Java Client Array (x! = new String@[5]): dims(x!)"
restore 0
x! = new String@[5]
dread x![]
dims$ = dims(x!)
gosub dims
dim x![1:5]
restore 0
dread x![]
print "BBx Array (dim x![1:5]): dims(x![])"
dims$ = dims(x![])
gosub dims
stop
data "Steve","Peggy","Jason","Tanner","Andy"
dims:
for x=dims.dim0base to dims.dim0elem+dims.dim0base-1
print "x! element",x," = ",x![x]
next x
return
>run
Java Array (x! = new String[5]): dims(x!)
x! element 0 = Steve
x! element 1 = Peggy
x! element 2 = Jason
x! element 3 = Tanner
x! element 4 = Andy
Java Client Array (x! = new String@[5]): dims(x!)
x! element 0 = Steve
x! element 1 = Peggy
x! element 2 = Jason
x! element 3 = Tanner
x! element 4 = Andy
BBx Array (dim x![1:5]): dims(x![])
x! element 1 = Steve
x! element 2 = Peggy
x! element 3 = Jason
x! element 4 = Tanner
x! element 5 = Andy
READY
>
|
Array references in CALL/ENTER must also distinguish between
BBj array references (array![])
and Java array references (array!):
READY
>load "callarray.txt"
READY
>/
restore 0
dim x![3]
dread x![]
print "Call with BBx array: ",x![]
call pgm(-2)+"::array",x![]
restore 0
y! = new int[4]
dread y![]
print "Call with Java array object: ",y![]
call pgm(-2)+"::object",y!
stop
data 0,1,2,3
array:
enter array![]
print array![]
exit
object:
enter object!
print object![]
exit
>run
Call with BBx array: 0 1 2 3
0 1 2 3
Call with Java array object: 0123
0123
READY
>
|
See Also
BBj
Object Variables
Calling
Java From BBj
CALL
Verb - BBj-Specific Information
DECLARE
Verb
ENTER
Verb - BBj-Specific Information
LET
Verb - BBj-Specific Information
NULL()
Function