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.
    • Method Summary

      All 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)  
      int cleanOverrides​(java.lang.String pattern)  
      void detach()  
      private java.lang.Class findClass​(java.lang.String className)  
      byte[] findClassBody​(java.lang.String className)
      Finds class object corresponding to the class name and returns its bytecode.
      (package private) byte[] getClassBody​(java.lang.Class clazz)  
      void getClasses​(java.util.concurrent.BlockingQueue<java.lang.String> queue, java.lang.Boolean abort, boolean doGetInfo, java.util.Optional<ClassFilter> filter)
      Inserts names of classes into queue.
      void getOverrides​(java.util.concurrent.BlockingQueue<java.lang.String> queue)  
      void setClassBody​(java.lang.String cname, byte[] nwBody)  
      • 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
    • Constructor Detail

      • InstrumentationProvider

        InstrumentationProvider​(java.lang.instrument.Instrumentation inst,
                                Transformer transformer)
    • Method Detail

      • setClassBody

        public void setClassBody​(java.lang.String cname,
                                 byte[] nwBody)
                          throws java.lang.instrument.UnmodifiableClassException
        Throws:
        java.lang.instrument.UnmodifiableClassException
      • getClassBody

        byte[] getClassBody​(java.lang.Class clazz)
                     throws java.lang.instrument.UnmodifiableClassException
        Throws:
        java.lang.instrument.UnmodifiableClassException
      • findClassBody

        public byte[] findClassBody​(java.lang.String className)
                             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)
      • getClasses

        public void getClasses​(java.util.concurrent.BlockingQueue<java.lang.String> queue,
                               java.lang.Boolean abort,
                               boolean doGetInfo,
                               java.util.Optional<ClassFilter> filter)
                        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
      • 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