Package org.jrd.agent

Class 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.
    • 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)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • instrumentation

        private final java.lang.instrument.Instrumentation instrumentation
      • loneliness

        private final java.lang.String loneliness
    • 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 queue
        abort - 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 loaded

        The 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