Package org.jrd.agent
Class InstrumentationProvider
- java.lang.Object
-
- org.jrd.agent.InstrumentationProvider
-
public class InstrumentationProvider extends java.lang.Object
This class stores instrumentation and transformer objects and handles the transformation, retrieval of bytecode and class names.
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.String
INFO_DELIMITER
private java.lang.instrument.Instrumentation
instrumentation
private java.lang.String
loneliness
private Transformer
transformer
-
Constructor Summary
Constructors Constructor Description InstrumentationProvider(java.lang.instrument.Instrumentation inst, Transformer transformer, java.lang.String loneliness)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addClass(java.lang.String className, byte[] b)
Tis was originally solved by custom classloader which had map(string, byte[]) and map(string, clazz).void
addJar(java.lang.String jarOrigName, byte[] decoded)
private static boolean
classloaderMatches(java.lang.String classlaoder, java.lang.Class loadedClass)
int
cleanOverrides(java.lang.String pattern)
void
detach()
private java.lang.Class
findClass(java.lang.String className, java.lang.String classLoader)
byte[]
findClassBody(java.lang.String className, java.lang.String classloader)
Finds class object corresponding to the class name and returns its bytecode.(package private) byte[]
getClassBody(java.lang.Class clazz, java.lang.String classloader)
void
getClasses(java.util.concurrent.BlockingQueue<java.lang.String> queue, java.lang.Boolean abort, boolean doGetInfo, java.util.Optional<ClassFilter> filter, java.lang.String classlaoder)
Inserts names of classes into queue.void
getOverrides(java.util.concurrent.BlockingQueue<java.lang.String> queue)
void
setClassBody(java.lang.String cname, byte[] nwBody, java.lang.String classloader)
-
-
-
Field Detail
-
transformer
private final Transformer transformer
-
instrumentation
private final java.lang.instrument.Instrumentation instrumentation
-
loneliness
private final java.lang.String loneliness
-
INFO_DELIMITER
private static final java.lang.String INFO_DELIMITER
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
InstrumentationProvider
InstrumentationProvider(java.lang.instrument.Instrumentation inst, Transformer transformer, java.lang.String loneliness)
-
-
Method Detail
-
setClassBody
public void setClassBody(java.lang.String cname, byte[] nwBody, java.lang.String classloader) throws java.lang.instrument.UnmodifiableClassException
- Throws:
java.lang.instrument.UnmodifiableClassException
-
getClassBody
byte[] getClassBody(java.lang.Class clazz, java.lang.String classloader) throws java.lang.instrument.UnmodifiableClassException
- Throws:
java.lang.instrument.UnmodifiableClassException
-
findClassBody
public byte[] findClassBody(java.lang.String className, java.lang.String classloader) throws java.lang.instrument.UnmodifiableClassException
Finds class object corresponding to the class name and returns its bytecode.- Parameters:
className
- name of class we want to get- Returns:
- bytecode of given class
- Throws:
java.lang.instrument.UnmodifiableClassException
- if the class can not be re-transformed
-
findClass
private java.lang.Class findClass(java.lang.String className, java.lang.String classLoader)
-
getClasses
public void getClasses(java.util.concurrent.BlockingQueue<java.lang.String> queue, java.lang.Boolean abort, boolean doGetInfo, java.util.Optional<ClassFilter> filter, java.lang.String classlaoder) throws java.lang.InterruptedException
Inserts names of classes into queue. Stops execution when it receives abort signal.- Parameters:
queue
- output queueabort
- abort signal- Throws:
java.lang.InterruptedException
- interrupted exception
-
classloaderMatches
private static boolean classloaderMatches(java.lang.String classlaoder, java.lang.Class loadedClass)
-
getOverrides
public void getOverrides(java.util.concurrent.BlockingQueue<java.lang.String> queue) throws java.lang.InterruptedException
- Throws:
java.lang.InterruptedException
-
cleanOverrides
public int cleanOverrides(java.lang.String pattern)
-
detach
public void detach()
-
addClass
public void addClass(java.lang.String className, byte[] b) throws java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException, java.lang.IllegalAccessException, java.lang.ClassNotFoundException
Tis was originally solved by custom classloader which had map(string, byte[]) and map(string, clazz). However such class, although visible in class listing and by decompilers, was not usable in tunrime compilation, nor eg initialized by class.forName. The class.forName is good test or the class being correctly loadedThe reflection could be avoided by doing fake classlaoder which was publishing defineClass method and friends, but they are final now
Waring! Do not work with target process JDK17, that would eed --add-opens java.base or similar:(
- Throws:
java.lang.NoSuchMethodException
java.lang.reflect.InvocationTargetException
java.lang.IllegalAccessException
java.lang.ClassNotFoundException
-
addJar
public void addJar(java.lang.String jarOrigName, byte[] decoded) throws java.io.IOException
- Throws:
java.io.IOException
-
-