/* * @(#)Instrumentation.java 1.7 04/06/08 * * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang.instrument; import java.io.File; import java.io.IOException; /* * Copyright 2003 Wily Technology, Inc. */ /** * This class provides services needed to instrument Java * programming language code. * Instrumentation is the addition of byte-codes to methods for the * purpose of gathering data to be utilized by tools. * Since the changes are purely additive, these tools do not modify * application state or behavior. * Examples of such benign tools include monitoring agents, profilers, * coverage analyzers, and event loggers. * *
* The only way to access an instance of the Instrumentation
* interface is for the JVM to be launched in a way that indicates
* the agent class - see
* {@linkplain java.lang.instrument the package specification}.
* The Instrumentation
instance is passed
* to the premain
method of the agent class.
* Once an agent acquires the Instrumentation
instance,
* the agent may call methods on the instance at any time.
*
* @since JDK1.5
*/
public interface Instrumentation {
/**
* Registers the supplied transformer. All future class definitions
* will be seen by the transformer, except definitions of classes upon which any
* registered transformer is dependent. If multiple transformers are
* registered, they will be called in the order added. If a transformer throws
* during execution, the JVM will still call the other registered transformers in order.
* The same transformer may be added more than once.
* All transformers registered with addTransformer
* will always see the class files before any external JVMTI ClassFileLoadHook event listener does.
*
* This method is intended for use in instrumentation, as described in the
* {@linkplain Instrumentation class specification}.
*
* @param transformer the transformer to register
* @throws java.lang.NullPointerException if passed a null
transformer
*/
void
addTransformer(ClassFileTransformer transformer);
/**
* Unregisters the supplied transformer. Future class definitions will
* not be shown to the transformer. Removes the most-recently-added matching
* instance of the transformer. Due to the multi-threaded nature of
* class loading, it is possible for a transformer to receive calls
* after it has been removed. Transformers should be written defensively
* to expect this situation.
*
* @param transformer the transformer to unregister
* @return true if the transformer was found and removed, false if the
* transformer was not found
* @throws java.lang.NullPointerException if passed a null
transformer
*/
boolean
removeTransformer(ClassFileTransformer transformer);
/**
* Returns whether or not the current JVM configuration supports redefinition of classes.
* The ability to redefine an already loaded class is an optional capability
* of a JVM.
* During a single instantiation of a single JVM, multiple calls to this
* method will always return the same answer.
* @return true if the current JVM configuration supports redefinition of classes,
* false if not.
* @see #redefineClasses
*/
boolean
isRedefineClassesSupported();
/**
* Redefine the supplied set of classes using the supplied class files. Operates on
* a set in order to allow interlocked changes to more than one class at the same time
* (a redefinition of class A can require a redefinition of class B).
*
*
* If a redefined method has active stack frames, those active frames continue to * run the bytecodes of the original method. * The redefined method will be used on new invokes. * *
* This method does not cause any initialization except that which would occur * under the customary JVM semantics. In other words, redefining a class * does not cause its initializers to be run. The values of static variables * will remain as they were prior to the call. * *
* Instances of the redefined class are not affected. * *
* Registered transformers will be called before the redefine operation is applied. * *
* The redefinition may change method bodies, the constant pool and attributes. * The redefinition must not add, remove or rename fields or methods, change the * signatures of methods, or change inheritance. These restrictions maybe be * lifted in future versions. * *
* A zero-length definitions
array is allowed, in this case, this
* method does nothing.
*
*
* If this method throws an exception, no classes have been redefined. *
* This method is intended for use in instrumentation, as described in the
* {@linkplain Instrumentation class specification}.
*
* @param definitions array of classes to redefine with corresponding definitions
* @throws java.lang.ClassNotFoundException if a specified class cannot be found
* @throws java.lang.instrument.UnmodifiableClassException if a specified class cannot be modified
* @throws java.lang.UnsupportedOperationException if the current configuration of the JVM does not allow
* redefinition ({@link #isRedefineClassesSupported} is false) or the redefinition made unsupported changes
* @throws java.lang.ClassFormatError if the data did not contain a valid class
* @throws java.lang.NoClassDefFoundError if the name in the class file is not equal to the name of the class
* @throws java.lang.UnsupportedClassVersionError if the class file version numbers are not supported
* @throws java.lang.ClassCircularityError if the new classes contain a circularity
* @throws java.lang.LinkageError if a linkage error occurs
* @throws java.lang.NullPointerException if the supplied definitions array or any of its components is null
.
*
* @see #isRedefineClassesSupported
* @see #addTransformer
* @see java.lang.instrument.ClassFileTransformer
*/
void
redefineClasses(ClassDefinition[] definitions)
throws ClassNotFoundException, UnmodifiableClassException;
/**
* Returns an array of all classes currently loaded by the JVM.
*
* @return an array containing all the classes loaded by the JVM, zero-length if there are none
*/
Class[]
getAllLoadedClasses();
/**
* Returns an array of all classes for which loader
is an initiating loader.
* If the supplied loader is null
, classes initiated by the bootstrap class
* loader are returned.
*
* @param loader the loader whose initiated class list will be returned
* @return an array containing all the classes for which loader is an initiating loader,
* zero-length if there are none
*/
Class[]
getInitiatedClasses(ClassLoader loader);
/**
* Returns an implementation-specific approximation of the amount of storage consumed by
* the specified object. The result may include some or all of the object's overhead,
* and thus is useful for comparison within an implementation but not between implementations.
*
* The estimate may change during a single invocation of the JVM.
*
* @param objectToSize the object to size
* @return an implementation-specific approximation of the amount of storage consumed by the specified object
* @throws java.lang.NullPointerException if the supplied Object is null
.
*/
long
getObjectSize(Object objectToSize);
}