blob: c2829eeb2c14645a168811e90487d6d558bddf11 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package com.sun.jdi;
27
28import java.util.List;
29import java.util.Map;
30
31/**
32 * An object that currently exists in the target VM. An ObjectReference
33 * mirrors only the object itself and is not specific to any
34 * {@link Field} or {@link LocalVariable} to which it is currently
35 * assigned. An ObjectReference can
36 * have 0 or more references from field(s) and/or variable(s).
37 * <p>
38 * Any method on <code>ObjectReference</code> which directly or
39 * indirectly takes <code>ObjectReference</code> as an parameter may throw
40 * {@link com.sun.jdi.VMDisconnectedException} if the target VM is
41 * disconnected and the {@link com.sun.jdi.event.VMDisconnectEvent} has been or is
42 * available to be read from the {@link com.sun.jdi.event.EventQueue}.
43 * <p>
44 * Any method on <code>ObjectReference</code> which directly or
45 * indirectly takes <code>ObjectReference</code> as an parameter may throw
46 * {@link com.sun.jdi.VMOutOfMemoryException} if the target VM has run out of memory.
47 * <p>
48 * Any method on <code>ObjectReference</code> or which directly or indirectly takes
49 * <code>ObjectReference</code> as parameter may throw
50 * {@link com.sun.jdi.ObjectCollectedException} if the mirrored object has been
51 * garbage collected.
52 *
53 * @author Robert Field
54 * @author Gordon Hirsch
55 * @author James McIlree
56 * @since 1.3
57 */
58public interface ObjectReference extends Value
59{
60 /**
61 * Gets the {@link ReferenceType} that mirrors the type
62 * of this object. The type may be a subclass or implementor of the
63 * declared type of any field or variable which currently holds it.
64 * For example, right after the following statement.
65 * <p>
66 * <code>Object obj = new String("Hello, world!");</code>
67 * <p>
68 * The ReferenceType of obj will mirror java.lang.String and not
69 * java.lang.Object.
70 * <p>
71 * The type of an object never changes, so this method will
72 * always return the same ReferenceType over the lifetime of the
73 * mirrored object.
74 * <p>
75 * The returned ReferenceType will be a {@link ClassType} or
76 * {@link ArrayType} and never an {@link InterfaceType}.
77 *
78 * @return the {@link ReferenceType} for this object.
79 */
80 ReferenceType referenceType();
81
82 /**
83 * Gets the value of a given instance or static field in this object.
84 * The Field must be valid for this ObjectReference;
85 * that is, it must be from
86 * the mirrored object's class or a superclass of that class.
87 *
88 * @param sig the field containing the requested value
89 * @return the {@link Value} of the instance field.
90 * @throws java.lang.IllegalArgumentException if the field is not valid for
91 * this object's class.
92 */
93 Value getValue(Field sig);
94
95 /**
96 * Gets the value of multiple instance and/or static fields in this object.
97 * The Fields must be valid for this ObjectReference;
98 * that is, they must be from
99 * the mirrored object's class or a superclass of that class.
100 *
101 * @param fields a list of {@link Field} objects containing the
102 * requested values.
103 * @return a Map of the requested {@link Field} objects with
104 * their {@link Value}.
105 * @throws java.lang.IllegalArgumentException if any field is not valid for
106 * this object's class.
107 */
108 Map<Field,Value> getValues(List<? extends Field> fields);
109
110 /**
111 * Sets the value of a given instance or static field in this object.
112 * The {@link Field} must be valid for this ObjectReference; that is,
113 * it must be from the mirrored object's class or a superclass of that class.
114 * If static, the field must not be final.
115 * <p>
116 * Object values must be assignment compatible with the field type
117 * (This implies that the field type must be loaded through the
118 * enclosing class's class loader). Primitive values must be
119 * either assignment compatible with the field type or must be
120 * convertible to the field type without loss of information.
121 * See the <a href="http://java.sun.com/docs/books/jls/">
122 * Java<sup><font size=-2>TM</font></sup> Language Specification</a>.
123 * section
124 * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#184206">5.2</a>
125 * for more information on assignment
126 * compatibility.
127 *
128 * @param field the field containing the requested value
129 * @param value the new value to assign
130 * @throws java.lang.IllegalArgumentException if the field is not valid for
131 * this object's class.
132 * @throws InvalidTypeException if the value's type does not match
133 * the field's type.
134 * @throws ClassNotLoadedException if 'value' is not null, and the field
135 * type has not yet been loaded through the appropriate class loader.
136 * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
137 */
138 void setValue(Field field, Value value)
139 throws InvalidTypeException, ClassNotLoadedException;
140
141 /** Perform method invocation with only the invoking thread resumed */
142 static final int INVOKE_SINGLE_THREADED = 0x1;
143 /** Perform non-virtual method invocation */
144 static final int INVOKE_NONVIRTUAL = 0x2;
145
146 /**
147 * Invokes the specified {@link Method} on this object in the
148 * target VM. The
149 * specified method can be defined in this object's class,
150 * in a superclass of this object's class, or in an interface
151 * implemented by this object. The method may be a static method
152 * or an instance method, but not a static initializer or constructor.
153 * Use {@link ClassType#newInstance} to create a new object and
154 * run its constructor.
155 * <p>
156 * The method invocation will occur in the specified thread.
157 * Method invocation can occur only if the specified thread
158 * has been suspended by an event which occurred in that thread.
159 * Method invocation is not supported
160 * when the target VM has been suspended through
161 * {@link VirtualMachine#suspend} or when the specified thread
162 * is suspended through {@link ThreadReference#suspend}.
163 * <p>
164 * The specified method is invoked with the arguments in the specified
165 * argument list. The method invocation is synchronous; this method
166 * does not return until the invoked method returns in the target VM.
167 * If the invoked method throws an exception, this method
168 * will throw an {@link InvocationException} which contains
169 * a mirror to the exception object thrown.
170 * <p>
171 * Object arguments must be assignment compatible with the argument type
172 * (This implies that the argument type must be loaded through the
173 * enclosing class's class loader). Primitive arguments must be
174 * either assignment compatible with the argument type or must be
175 * convertible to the argument type without loss of information.
176 * If the method being called accepts a variable number of arguments,
177 * then the last argument type is an array of some component type.
178 * The argument in the matching position can be omitted, or can be null,
179 * an array of the same component type, or an argument of the
180 * component type followed by any number of other arguments of the same
181 * type. If the argument is omitted, then a 0 length array of the
182 * component type is passed. The component type can be a primitive type.
183 * Autoboxing is not supported.
184 *
185 * See the <a href="http://java.sun.com/docs/books/jls/">
186 * Java Language Specification</a>.
187 * section
188 * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#184206">5.2</a>
189 * for more information on assignment compatibility.
190 * <p>
191 * By default, the method is invoked using dynamic lookup as
192 * documented in the
193 * <a href="http://java.sun.com/docs/books/jls/">
194 * Java Language Specification</a>
195 * second edition, section
196 * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#45606">15.12.4.4</a>;
197 * in particular, overriding based on the runtime type of the object
198 * mirrored by this {@link ObjectReference} will occur. This
199 * behavior can be changed by specifying the
200 * {@link #INVOKE_NONVIRTUAL} bit flag in the <code>options</code>
201 * argument. If this flag is set, the specified method is invoked
202 * whether or not it is overridden for this object's runtime type.
203 * The method, in this case, must not belong to an interface and
204 * must not be abstract. This option is useful for performing method
205 * invocations like those done with the <code>super</code> keyword in
206 * the Java programming language.
207 * <p>
208 * By default, all threads in the target VM are resumed while
209 * the method is being invoked if they were previously
210 * suspended by an event or by {@link VirtualMachine#suspend} or
211 * {@link ThreadReference#suspend}. This is done to prevent the deadlocks
212 * that will occur if any of the threads own monitors
213 * that will be needed by the invoked method.
214 * Note, however, that this implicit resume acts exactly like
215 * {@link ThreadReference#resume}, so if the thread's suspend
216 * count is greater than 1, it will remain in a suspended state
217 * during the invocation and thus a deadlock could still occur.
218 * By default, when the invocation completes,
219 * all threads in the target VM are suspended, regardless their state
220 * before the invocation.
221 * It is possible that
222 * breakpoints or other events might occur during the invocation.
223 * This can cause deadlocks as described above. It can also cause a deadlock
224 * if invokeMethod is called from the client's event handler thread. In this
225 * case, this thread will be waiting for the invokeMethod to complete and
226 * won't read the EventSet that comes in for the new event. If this
227 * new EventSet is SUSPEND_ALL, then a deadlock will occur because no
228 * one will resume the EventSet. To avoid this, all EventRequests should
229 * be disabled before doing the invokeMethod, or the invokeMethod should
230 * not be done from the client's event handler thread.
231 * <p>
232 * The resumption of other threads during the invocation can be prevented
233 * by specifying the {@link #INVOKE_SINGLE_THREADED}
234 * bit flag in the <code>options</code> argument; however,
235 * there is no protection against or recovery from the deadlocks
236 * described above, so this option should be used with great caution.
237 * Only the specified thread will be resumed (as described for all
238 * threads above). Upon completion of a single threaded invoke, the invoking thread
239 * will be suspended once again. Note that any threads started during
240 * the single threaded invocation will not be suspended when the
241 * invocation completes.
242 * <p>
243 * If the target VM is disconnected during the invoke (for example, through
244 * {@link VirtualMachine#dispose}) the method invocation continues.
245 *
246 * @param thread the thread in which to invoke.
247 * @param method the {@link Method} to invoke.
248 * @param arguments the list of {@link Value} arguments bound to the
249 * invoked method. Values from the list are assigned to arguments
250 * in the order they appear in the method signature.
251 * @param options the integer bit flag options.
252 * @return a {@link Value} mirror of the invoked method's return value.
253 * @throws java.lang.IllegalArgumentException if the method is not
254 * a member of this object's class, if the size of the argument list
255 * does not match the number of declared arguemnts for the method,
256 * if the method is a constructor or static intializer, or
257 * if {@link #INVOKE_NONVIRTUAL} is specified and the method is
258 * either abstract or an interface member.
259 * @throws {@link InvalidTypeException} if any argument in the
260 * argument list is not assignable to the corresponding method argument
261 * type.
262 * @throws ClassNotLoadedException if any argument type has not yet been loaded
263 * through the appropriate class loader.
264 * @throws IncompatibleThreadStateException if the specified thread has not
265 * been suspended by an event.
266 * @throws InvocationException if the method invocation resulted in
267 * an exception in the target VM.
268 * @throws InvalidTypeException If the arguments do not meet this requirement --
269 * Object arguments must be assignment compatible with the argument
270 * type. This implies that the argument type must be
271 * loaded through the enclosing class's class loader.
272 * Primitive arguments must be either assignment compatible with the
273 * argument type or must be convertible to the argument type without loss
274 * of information. See JLS section 5.2 for more information on assignment
275 * compatibility.
276 * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
277 */
278 Value invokeMethod(ThreadReference thread, Method method,
279 List<? extends Value> arguments, int options)
280 throws InvalidTypeException,
281 ClassNotLoadedException,
282 IncompatibleThreadStateException,
283 InvocationException;
284
285 /**
286 * Prevents garbage collection for this object. By default all
287 * {@link ObjectReference} values returned by JDI may be collected
288 * at any time the target VM is running. A call to this method
289 * guarantees that the object will not be collected.
290 * {@link #enableCollection} can be used to allow collection once
291 * again.
292 * <p>
293 * Calls to this method are counted. Every call to this method
294 * requires a corresponding call to {@link #enableCollection} before
295 * garbage collection is re-enabled.
296 * <p>
297 * Note that while the target VM is suspended, no garbage collection
298 * will occur because all threads are suspended. The typical
299 * examination of variables, fields, and arrays during the suspension
300 * is safe without explicitly disabling garbage collection.
301 * <p>
302 * This method should be used sparingly, as it alters the
303 * pattern of garbage collection in the target VM and,
304 * consequently, may result in application behavior under the
305 * debugger that differs from its non-debugged behavior.
306 * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
307 * -see {@link VirtualMachine#canBeModified()}.
308 */
309 void disableCollection();
310
311 /**
312 * Permits garbage collection for this object. By default all
313 * {@link ObjectReference} values returned by JDI may be collected
314 * at any time the target VM is running. A call to this method
315 * is necessary only if garbage collection was previously disabled
316 * with {@link #disableCollection}.
317 * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
318 * -see {@link VirtualMachine#canBeModified()}.
319 */
320 void enableCollection();
321
322 /**
323 * Determines if this object has been garbage collected in the target
324 * VM.
325 *
326 * @return <code>true</code> if this {@link ObjectReference} has been collected;
327 * <code>false</code> otherwise.
328 * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
329 * -see {@link VirtualMachine#canBeModified()}.
330 */
331 boolean isCollected();
332
333 /**
334 * Returns a unique identifier for this ObjectReference.
335 * It is guaranteed to be unique among all
336 * ObjectReferences from the same VM that have not yet been disposed.
337 * The guarantee applies as long
338 * as this ObjectReference has not yet been disposed.
339 *
340 * @return a long unique ID
341 */
342 long uniqueID();
343
344 /**
345 * Returns a List containing a {@link ThreadReference} for
346 * each thread currently waiting for this object's monitor.
347 * See {@link ThreadReference#currentContendedMonitor} for
348 * information about when a thread is considered to be waiting
349 * for a monitor.
350 * <p>
351 * Not all target VMs support this operation. See
352 * VirtualMachine#canGetMonitorInfo to determine if the
353 * operation is supported.
354 *
355 * @return a List of {@link ThreadReference} objects. The list
356 * has zero length if no threads are waiting for the monitor.
357 * @throws java.lang.UnsupportedOperationException if the
358 * target VM does not support this operation.
359 * @throws IncompatibleThreadStateException if any
360 * waiting thread is not suspended
361 * in the target VM
362 */
363 List<ThreadReference> waitingThreads()
364 throws IncompatibleThreadStateException;
365
366 /**
367 * Returns an {@link ThreadReference} for the thread, if any,
368 * which currently owns this object's monitor.
369 * See {@link ThreadReference#ownedMonitors} for a definition
370 * of ownership.
371 * <p>
372 * Not all target VMs support this operation. See
373 * VirtualMachine#canGetMonitorInfo to determine if the
374 * operation is supported.
375 *
376 * @return the {@link ThreadReference} which currently owns the
377 * monitor, or null if it is unowned.
378 *
379 * @throws java.lang.UnsupportedOperationException if the
380 * target VM does not support this operation.
381 * @throws IncompatibleThreadStateException if the owning thread is
382 * not suspended in the target VM
383 */
384 ThreadReference owningThread() throws IncompatibleThreadStateException;
385
386 /**
387 * Returns the number times this object's monitor has been
388 * entered by the current owning thread.
389 * See {@link ThreadReference#ownedMonitors} for a definition
390 * of ownership.
391 * <p>
392 * Not all target VMs support this operation. See
393 * VirtualMachine#canGetMonitorInfo to determine if the
394 * operation is supported.
395 *
396 * @see #owningThread
397 * @return the integer count of the number of entries.
398 *
399 * @throws java.lang.UnsupportedOperationException if the
400 * target VM does not support this operation.
401 * @throws IncompatibleThreadStateException if the owning thread is
402 * not suspended in the target VM
403 */
404 int entryCount() throws IncompatibleThreadStateException;
405
406 /**
407 * Returns objects that directly reference this object.
408 * Only objects that are reachable for the purposes of garbage collection
409 * are returned. Note that an object can also be referenced in other ways,
410 * such as from a local variable in a stack frame, or from a JNI global
411 * reference. Such non-object referrers are not returned by this method.
412 * <p>
413 * Not all target virtual machines support this operation.
414 * Use {@link VirtualMachine#canGetInstanceInfo()}
415 * to determine if the operation is supported.
416 *
417 * @see VirtualMachine#instanceCounts(List)
418 * @see ReferenceType#instances(long)
419
420 * @param maxReferrers The maximum number of referring objects to return.
421 * Must be non-negative. If zero, all referring
422 * objects are returned.
423 * @return a of List of {@link ObjectReference} objects. If there are
424 * no objects that reference this object, a zero-length list is returned..
425 * @throws java.lang.UnsupportedOperationException if
426 * the target virtual machine does not support this
427 * operation - see
428 * {@link VirtualMachine#canGetInstanceInfo() canGetInstanceInfo()}
429 * @throws java.lang.IllegalArgumentException if maxReferrers is less
430 * than zero.
431 * @since 1.6
432 */
433 List<ObjectReference> referringObjects(long maxReferrers);
434
435
436 /**
437 * Compares the specified Object with this ObjectReference for equality.
438 *
439 * @return true if the Object is an ObjectReference, if the
440 * ObjectReferences belong to the same VM, and if applying the
441 * "==" operator on the mirrored objects in that VM evaluates to true.
442 */
443 boolean equals(Object obj);
444
445 /**
446 * Returns the hash code value for this ObjectReference.
447 *
448 * @return the integer hash code
449 */
450 int hashCode();
451}