Package org.jacoco.core.runtime
Class ModifiedSystemClassRuntime
- java.lang.Object
-
- org.jacoco.core.runtime.AbstractRuntime
-
- org.jacoco.core.runtime.ModifiedSystemClassRuntime
-
- All Implemented Interfaces:
IExecutionDataAccessorGenerator
,IRuntime
public class ModifiedSystemClassRuntime extends AbstractRuntime
ThisIRuntime
implementation works with a modified system class. A new static field is added to a bootstrap class that will be used by instrumented classes. As the system class itself needs to be instrumented this runtime requires a Java agent.
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.String
ACCESS_FIELD_TYPE
private java.lang.String
accessFieldName
private java.lang.Class<?>
systemClass
private java.lang.String
systemClassName
-
Fields inherited from class org.jacoco.core.runtime.AbstractRuntime
data
-
-
Constructor Summary
Constructors Constructor Description ModifiedSystemClassRuntime(java.lang.Class<?> systemClass, java.lang.String accessFieldName)
Creates a new runtime based on the given class and members.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static void
createDataField(org.objectweb.asm.ClassVisitor visitor, java.lang.String dataField)
static IRuntime
createFor(java.lang.instrument.Instrumentation inst, java.lang.String className)
Creates a newModifiedSystemClassRuntime
using the given class as the data container.static IRuntime
createFor(java.lang.instrument.Instrumentation inst, java.lang.String className, java.lang.String accessFieldName)
Creates a newModifiedSystemClassRuntime
using the given class as the data container.int
generateDataAccessor(long classid, java.lang.String classname, int probecount, org.objectweb.asm.MethodVisitor mv)
This method generates the byte code required to obtain the coverage data structure for the class with the given id.static byte[]
instrument(byte[] source, java.lang.String accessFieldName)
Adds the static data field to the given class definition.void
shutdown()
Allows the coverage runtime to cleanup internals.void
startup(RuntimeData data)
Subclasses must call this method when overwriting it.-
Methods inherited from class org.jacoco.core.runtime.AbstractRuntime
createRandomId
-
-
-
-
Field Detail
-
ACCESS_FIELD_TYPE
private static final java.lang.String ACCESS_FIELD_TYPE
- See Also:
- Constant Field Values
-
systemClass
private final java.lang.Class<?> systemClass
-
systemClassName
private final java.lang.String systemClassName
-
accessFieldName
private final java.lang.String accessFieldName
-
-
Constructor Detail
-
ModifiedSystemClassRuntime
public ModifiedSystemClassRuntime(java.lang.Class<?> systemClass, java.lang.String accessFieldName)
Creates a new runtime based on the given class and members.- Parameters:
systemClass
- system class that contains the execution dataaccessFieldName
- name of the public static runtime access field
-
-
Method Detail
-
startup
public void startup(RuntimeData data) throws java.lang.Exception
Description copied from class:AbstractRuntime
Subclasses must call this method when overwriting it.- Specified by:
startup
in interfaceIRuntime
- Overrides:
startup
in classAbstractRuntime
- Parameters:
data
- the execution data for this runtime- Throws:
java.lang.Exception
- any internal problem during startup
-
shutdown
public void shutdown()
Description copied from interface:IRuntime
Allows the coverage runtime to cleanup internals. This class should be called when classes instrumented for this runtime are not used any more.
-
generateDataAccessor
public int generateDataAccessor(long classid, java.lang.String classname, int probecount, org.objectweb.asm.MethodVisitor mv)
Description copied from interface:IExecutionDataAccessorGenerator
This method generates the byte code required to obtain the coverage data structure for the class with the given id. Typically the instrumentation process will embed this code into a method that is called on class initialization. This method can be called at any time even outside the target VM. The generated code must push aboolean[]
instance to the operand stack. Except this result object the generated code must not make any assumptions about the structure of the embedding method or class. The generated code must not use or allocate local variables.- Parameters:
classid
- identifier of the classclassname
- VM class nameprobecount
- probe count for this classmv
- code output- Returns:
- additional stack size required by the implementation, including the instance pushed to the stack
-
createFor
public static IRuntime createFor(java.lang.instrument.Instrumentation inst, java.lang.String className) throws java.lang.ClassNotFoundException
Creates a newModifiedSystemClassRuntime
using the given class as the data container. Member is created with internal default name. The given class must not have been loaded before by the agent.- Parameters:
inst
- instrumentation interfaceclassName
- VM name of the class to use- Returns:
- new runtime instance
- Throws:
java.lang.ClassNotFoundException
- id the given class can not be found
-
createFor
public static IRuntime createFor(java.lang.instrument.Instrumentation inst, java.lang.String className, java.lang.String accessFieldName) throws java.lang.ClassNotFoundException
Creates a newModifiedSystemClassRuntime
using the given class as the data container. The given class must not have been loaded before by the agent.- Parameters:
inst
- instrumentation interfaceclassName
- VM name of the class to useaccessFieldName
- name of the added runtime access field- Returns:
- new runtime instance
- Throws:
java.lang.ClassNotFoundException
- if the given class can not be found
-
instrument
public static byte[] instrument(byte[] source, java.lang.String accessFieldName)
Adds the static data field to the given class definition.- Parameters:
source
- class definition sourceaccessFieldName
- name of the runtime access field- Returns:
- instrumented version with added members
-
createDataField
private static void createDataField(org.objectweb.asm.ClassVisitor visitor, java.lang.String dataField)
-
-