CLASS
tcl.lang.ReflectObject -- This class is used to reference Java objects.
EXTENDS
tcl.lang.InternalRep
METHODS
static TclObject newInstance(Interp interp, Class class, Object javaObj)
static Object get(Interp interp, TclObject tobj)
static Class getClass(Interp interp, TclObject tobj)
ARGUMENTS
DESCRIPTION
newInstance
get
getClass
SEE ALSO
KEYWORDS

CLASS

tcl.lang.ReflectObject -- This class is used to reference Java objects.

EXTENDS

tcl.lang.InternalRep

METHODS

static TclObject newInstance(Interp interp, Class class, Object javaObj)

static Object get(Interp interp, TclObject tobj)

static Class getClass(Interp interp, TclObject tobj)

ARGUMENTS

Interp interp
If tobj is not a valid TclObject, an error message is left in the interpreter's result object unless interp is NULL.

Object javaObj
Java Object to wrap into a TclObject.

Class class
Class that the javaObj will be reflected as.

TclObject tobj
TclObject from which to extract the Java Object or Class.

DESCRIPTION

This class is used to create and access arbitrary Java objects using the Java Reflection API. It wraps a Java object (i.e., an instance of a Java class) in a handle and exposes the handle to Tcl scripts. The object is registered inside the interpreter and is given a string name. Tcl scripts can manipulate this object as long as the the reference count of the object is greater than zero.

newInstance
The newInstance method creates an object handle to javaObj. The object handle can later be used to access javaObj via the java::* commands. This method is normally used to pass Java object to Tcl scripts. For example, a command procedure can return an object handle to Tcl scripts by executing the following:
Object obj_to_return = new Object();
interp.setResult(
    ReflectObject.newInstance(interp, Object.class, obj_to_return));
The object handle returned by this method is only valid in the given interpreter, interp.

It is CRITICAL that the class argument to newInstance be of the correct type. For example, an instance of a String object can be referenced as a String or as an Object but it can not be referenced as say an Integer. It is also CRITICAL that an object not be referenced as it's most derived type when it should really be referenced as a parent type. Here is an example of a common mistake:

// assume that getHashtable() is defined like this:
// public Hashtable getHashtable() { return new DerivedFromHashtable(); }

Hashtable h = getHashtable();
interp.setResult(
    ReflectObject.newInstance(interp, h.getClass(), h));

This object should be referenced as a Hashtable not a DerivedFromHashtable. If you incorrectly reference this object as it's most derived type the reflection system will not work as expected and you could introduce serious security bugs into your program. The correct way to implement the previous example is like this:

// assume that getHashtable() is defined like this:
// public Hashtable getHashtable() { return new DerivedFromHashtable(); }

Hashtable h = getHashtable();
interp.setResult(
    ReflectObject.newInstance(interp, Hashtable.class, h));

get
The get method returns the Java Object stored inside tobj. The tobj argument must contain a valid Java object handle, otherwise an error is reported.

getClass
The getClass method returns the Java Class of the Java Object stored inside tobj. The tobj argument must contain a valid Java object handle, otherwise an error is reported.

SEE ALSO

InternalRep, java, TclObject, TclList, TclString, TclInteger, TclBoolean, TclDouble

KEYWORDS

reflect object, internal representation, object, object type
Copyright © 1996-1998 Sun Microsystems, Inc.
Copyright © 1995-1997 Roger E. Critchlow Jr.