BEA Logo BEA WebLogic Server Release 6.1

  BEA Home  |  Events  |  Solutions  |  Partners  |  Products  |  Services  |  Download  |  Developer Center  |  WebSUPPORT

 

  |  

  WebLogic Server Doc Home   |     WebLogic jCOM Reference Guide   |   Previous Topic   |   Next Topic   |   Contents   |   View as PDF

Supported COM data types, and their Java Equivalents

 

WebLogic jCOM supports the full range of COM Automation types. Our philosophy has been to avoid introducing new Java classes in order to access COM types. This means that COM Variants map onto Objects (java.lang.Long, etc.), and Variants containing arrays map onto Java arrays. You won't find a com.bea.jcom.Variant class that you need to use, for example.

WebLogic jCOM also supports accessing some Java collection types as Visual Basic Collections.

Below you will find

 


Accessing Java Objects as Visual Basic Collections

Visual Basic has a built-in COM class called Collection. WebLogic jCOM provides support for accessing instances of java.util.Vector and java.util.List as VB Collections.

Example Visual BASIC code

Private Sub Form_Load() 
Dim c As Collection 
Set c = GetObject("firstjvm:java.util.LinkedList") 
c.Add "hello" ' List is now: "hello" 
c.Add Now, , "hello" ' List is now: , "hello" 
c.Add "Goodbye", , , "hello" ' List is now: now, "hello", "Goodbye" 
c.Add "Before", , 3 ' List is now: now, "hello", "Before", "Goodbye" 
c.Add "After", , , 4 ' List is now: now, "hello", "Before", 
"Goodbye", "After" 
For Each e In c 
MsgBox e 
Next 
c.Remove 2 ' List is now: now, "Before", "Goodbye", "After" 
c.Remove "Goodbye" ' List is now: now, "Before", "After" 
MsgBox c.Item(1) 
MsgBox c.Count
End Sub

VB

Maps to java.util.Vector

Notes

Collection.Add(item)

aVector.addElement(item)


Collection.Add(item, , before)

aVector.insertElementAt(before - 1, item)

if before is a number

Collection.Add(item, , before)

aVector.insertElementAt(aVector.indexOf(before), item)

if before is not a number

Collection.Add(item, , , after)

aVector.insertElementAt(after, item)

if after is not a number

Collection.Add(item, , , after)

aVector.insertElementAt(aVector.indexOf(after) + 1, item)

if after is a number

Collection.Count

aVector.size()


Collection.Item(index)

aVector.elementAt(index - 1)

index must be a number

Collection.Remove(index)

aVector.removeElementAt(index - 1)

if index is a number

Collection.Remove(index)

aVector.removeElement(index)

if index is not a number

For Each x in aCollection

x will take on the value of each object in the aVector.elements() enumeration


VB

Maps to java.util.List

Notes

Collection.Add(item)

aList.target.add(item)


Collection.Add(item, , before)

aList.add(before - 1, item)

if before is a number

Collection.Add(item, , before)

aList.add(aVector.indexOf(before), item)

if before is not a number

Collection.Add(item, , , after)

aList.add(after, item)

if after is not a number

Collection.Add(item, , , after)

aList.add(aVector.indexOf(after) + 1, item)

if after is a number

Collection.Count

aList.size()


Collection.Item(index)

aList.get(index - 1)

index must be a number

Collection.Remove(index)

aList.remove(index - 1)

if index is a number

Collection.Remove(index)

aList.remove(index)

if index is not a number

For Each x in aCollection

x will take on the value of each object in the aList.listIterator() iterator


 


How COM IDL types map to Java, VB, and VC++

In the following table we show each IDL type, describing its use from Java, from Visual BASIC and from Visual C++.

Table 7-1

IDL

Java

Visual BASIC

Visual C++

[in] VARIANT_BOOL

boolean

ByVal boolean

VARIANT_BOOL

[in, out] or [out] VARIANT_BOOL*

boolean[] single element array

boolean

VARIANT_BOOL*

[in] unsigned char

byte

ByVal byte

unsigned char

[in, out] or [out] unsigned char*

byte[] single element array

byte

unsigned char*

[in] double

double

ByVal Double

double

[in, out] or [out] double*

double[] single element array

double

double*

[in] float

float

ByVal Single

float

[in, out] or [out] float*

float[] single element array

Single

float*

[in] long

int IDL long is 32 bits

ByVal Long>

long>

[in, out] or [out] long*

int[] single element array

Long>

long*

[in] short

short

ByVal Integer>

short>

[in, out] or [out] short*

short[] single element array

Integer

short*

[in] BSTR

java.lang.String

ByVal String

BSTR

[in, out] or [out] BSTR*

java.lang.String[] single element array

String

BSTR*

[in] CY

long CY is fixed point, 64 bit

ByVal Currency

CURRENCY

[in, out] or [out] CY*

long[] single element array

Currency

CURRENCY*

[in] DATE

java.util.Date

ByVal Date

DATE

[in, out] or [out] DATE*

java.util.Date[]

Date

DATE*

[in] IDispatch*

java.lang.Object

ByVal Object

IDispatch*

[in, out] or [out] IDispatch**

java.lang.Object[] single element array

Object

IDispatch**

[in] ISomeInterface*

ISomeInterface Generated Java Interface

ByVal ISomeInterface

ISomeInterface*

[in, out] or [out] ISomeInterface**

ISomeInterface[] single element array

ISomeInterface

ISomeInterface**

[in] SomeClass*

SomeClass Generated Java Class

ByVal SomeClass

SomeClass*

[in, out] or [out] SomeClass**

SomeClass[] single element array

SomeClass

SomeClass**

[in] IUnknown*

java.lang.Object

Specific class/interface

IUnknown*

[in] Variant

java.lang.Object

ByVal Variant

VARIANT

[in, out] or [out] Variant*

java.lang.Object[] single element array

Variant

VARIANT*

[in] SAFEARRAY(unsigned char)

byte[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(unsigned char)*

byte[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(VARIANT_BOOL)

boolean[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(VARIANT_BOOL)*

boolean[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(short)

short[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(short)*

short[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(long)

int[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(long)*

int[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(float)

float[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(float)*

float[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(double)

double[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(double)*

double[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(CURRENCY)

long[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(CURRENCY)*

long[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(DATE)

java.util.Date[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(DATE)*

java.util.Date[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(BSTR)

String[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(BSTR)*

String[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(LPDISPATCH)

Object[]

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(LPDISPATCH)*

Object[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(VARIANT)

Object

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(VARIANT)*

Object[][]

not supported by VB

SAFEARRAY**

[in] SAFEARRAY(LPUNKNOWN)

Object

not supported by VB

SAFEARRAY*

[in, out] or [out] SAFEARRAY(LPUNKNOWN)*

Object[][]

not supported by VB

SAFEARRAY**





 


How COM Variants containing different types map to Java

The following table shows how Variants are mapped to Java types.

Variant Containing a

Maps to Java type

VARIANT_BOOL

java.lang.Boolean

VARIANT_BOOL*

java.lang.Boolean[] single element array

unsigned char

java.lang.Byte

unsigned char*

java.lang.Byte[] single elment array

double

java.lang.Double

double*

java.lang.Double[] single element array

float

java.lang.Float

float*

java.lang.Float[] single element array

long

java.lang.Integer IDL long is 32 bits

long*

java.lang.Integer[] single element array

short

java.lang.Short

short*

java.lang.Short[] single element array

BSTR

java.lang.String

BSTR*

java.lang.String[]single element array

CY

java.lang.Long

CY*

java.lang.Long[]single element array

Decimal

java.math.BigDecimal

Decimal*

java.math.BigDecimal[]single element array

DATE

java.util.Date

DATE*

java.util.Date[]

SCODE

java.lang.Long

SCODE*

java.lang.Long[] single element array

IDispatch*

java.lang.Object

IUnknown*

java.lang.Object

Single dimensional array of VARIANT_BOOLs

boolean[]

Single dimensional array of unsigned chars

byte[]

Single dimensional array of doubles

double[]

Single dimensional array of floats

float[]

Single dimensional array of longs

int[] IDL long is 32 bits</TD

Single dimensional array of shorts

short[]

Single dimensional array of BSTRs

java.lang.String[]

Single dimensional array of CYs

long[]

Single dimensional array of DATEs

java.util.Date[]

Single dimensional array of SCODEs

long[]

Single dimensional array of IDispatch*s

java.lang.Object[]

Single dimensional array of IUnknown*s

java.lang.Object[]

Single dimensional array of Variants

java.lang.Object[]

Two dimensional array of Variants

java.lang.Object[][]



You can also pass a Variant of type VT_EMPTY or VT_NULL by passing com.bea.jcom.EmptyVariant.TYPE and com.bea.jcom.NullVariant.TYPE.

 


Type conversions used during late-bound access from COM to Java

These tables show the Java expression used to convert a VB value 'vb' of the VB type on the left to the Java type at the top. Note that conversions marked with a * can also raise Type Mismatch Error.

Java boolean, byte, short and int

Java(across) VB (down)

boolean

byte

short

int

Boolean

natural

vb ? 1 : 0

vb ? 1 : 0

vb ? 1 : 0

Byte(0..255)

vb != 0

new Integer(vb).byteValue()

new Integer(vb).shortValue()

new Integer(vb).intValue()

Integer(16 bit)

vb != 0

new Short(vb).byteValue()

natural

new Short(vb).intValue()

Long(32 bit)

vb != 0

new Integer(vb).byteValue()

new Integer(vb).shortValue()

natural

Single

vb != 0.0F

new Float(vb).byteValue()

new Float(vb).shortValue()

new Float(vb).intValue()

Double

vb != 0.0

new Double(vb).byteValue()

new Double(vb).shortValue()

new Double(vb).intValue()

Currency(64 bit)

vb != 0

new Long(vb).byteValue()

new Long(vb).shortValue()

new Long(vb).intValue()

String

new Boolean(vb).booleanValue()

new Long(vb).byteValue()*

new Long(vb).shortValue()*

new Long(vb).intValue()*

Date

Type Mismatch Error

Type Mismatch Error

Type Mismatch Error

Type Mismatch Error

Object

Type Mismatch Error

Type Mismatch Error

Type Mismatch Error

Type Mismatch Error

Variants

As above depending on content




Java long, char, float and double

VB/Java

long

char

float

double

Boolean

vb ? 1 : 0

vb ? (char)1 : (char)0

vb ? 1.0F : 0.0F

vb ? 1.0 : 0.0

Byte(0..255)

new Integer(vb).longValue()

(char)(new Integer(vb).intValue())

new Integer(vb).floatValue()

new Integer(vb).doubleValue()

Integer(16 bit)

new Short(vb).longValue()

(char)(new Short(vb).intValue())

new Short(vb).floatValue()

new Short(vb).doubleValue()

Long(32 bit)

new Integer(vb).longValue()

(char)(new Integer(vb).byteValue())

new Integer(vb).floatValue()

new Integer(vb).doubleValue()

Single

new Float(vb).longValue()

(char)(new Float(vb).intValue())

natural

new Float(vb).doubleValue()

Double

new Double(vb).longValue()

(char)(new Double(vb).intValue())

new Double(vb).floatValue()

natural

Currency(64 bit)

natural

(char)(new Long(vb).intValue())

new Long(vb).floatValue()

new Long(vb).doubleValue()

String

new Long(vb).longValue()

(char)(new Long(vb).intValue())

new Long(vb).floatValue()

new Long(vb).doubleValue()

Date

Type Mismatch Error

Type Mismatch Error

Type Mismatch Error

Type Mismatch Error

Object

Error

Error

Error

Error

Variants

As above depending on content




Java String, Date and Object

VB/Java

String

Date

Object

Boolean

vb + ""

Error

new Boolean(vb)

Byte(0..255)

vb + ""

Error

new Byte(vb)

Integer(16 bit)

vb + ""

Error

new Short(vb)

Long(32 bit)

vb + ""

Error

new Integer(vb)

Single

vb + ""

Error

new Float(vb)

Double

vb + ""

Error

new Double(vb)

Currency

vb + ""

Error

new Long(vb)

String

natural

new Date(vb)

vb (as String_

Date

vb.toString()

Natural

vb (as Date)

Object

vb.toString

Error

vb

Variant

As above depending on content



Arrays

If a Java method has a parameter which is an array, then if you pass a VB parameter by value to that method you will get an error. If you pass a value by reference, and if the type matches precisely (see below), the Java method will receive a single element array whose single element can be modified to change the corresponding VB parameter. If you pass an array, and if the array content type matches precisely, the Java method will receive an array whose elements can be modified to change the corresponding VB parameter.

Java type

VB pass by reference match

boolean[]

Boolean passed by reference

byte[]

Byte passed by reference

short[]

Short passed by reference

int[]

Long passed by reference

long[]

Currency passed by reference

float[]

Single passed by reference

double[]

Double passed by reference

String[]

String passed by reference

java.util.Date[]

Date passed by reference



Arrays:

Java type

Parameter of this VB type will match

boolean[]

Dim anArray(n) as Boolean

byte[]

Dim anArray(n) as Byte

short[]

Dim anArray(n) as Short

int[]

Dim anArray(n) as Long

long[]

Dim anArray(n) as Currency

float[]

Dim anArray(n) as Single

double[]

Dim anArray(n) as Double

String[]

Dim anArray(n) as String

java.util.Date[]

Dim anArray(n) as Date

Object[]

Dim anArray(n) as String

Object[]

Dim anArray(n) as Date

Object[]

Dim anArray(n) as Object

Object[]

Dim anArray(n) as Variant

 


Accessing COM VariantEnums from Java

Some COM methods return a COM VariantEnumeration type. WebLogic jCOM's java2com tool automatically converts the returned type into a standard Java java.lang.Enumeration. There isn't a perfect match though, since COM Enumerations have no equivalent to the 'hasMoreElements()' call, meaning that you have to keep on doing 'nextElement' until you get a 'NoSuchElementException'.

We do provide a workaround -- if you set the JCOM_PREFETCH_ENUMS Java property, WebLogic jCOM will pre-fetch the next element behind the scenes, and thus allow the 'hasMoreElements()' method to work properly.

 

back to top previous page next page