Class HotSwapper


  • public class HotSwapper
    extends java.lang.Object
    A utility class for dynamically reloading a class by the Java Platform Debugger Architecture (JPDA), or HotSwap. It works only with JDK 1.4 and later.

    Note: The new definition of the reloaded class must declare the same set of methods and fields as the original definition. The schema change between the original and new definitions is not allowed by the JPDA.

    To use this class, the JVM must be launched with the following command line options:

    For Java 1.4,

    java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

    For Java 5,

    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

    Note that 8000 is the port number used by HotSwapper. Any port number can be specified. Since HotSwapper does not launch another JVM for running a target application, this port number is used only for inter-thread communication.

    Furthermore, JAVA_HOME/lib/tools.jar must be included in the class path.

    Using HotSwapper is easy. See the following example:

     CtClass clazz = ...
     byte[] classFile = clazz.toBytecode();
     HotSwapper hs = new HostSwapper(8000);  // 8000 is a port number.
     hs.reload("Test", classFile);
     

    reload() first unload the Test class and load a new version of the Test class. classFile is a byte array containing the new contents of the class file for the Test class. The developers can repatedly call reload() on the same HotSwapper object so that they can reload a number of classes.

    Since:
    3.1
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static java.lang.String HOST_NAME  
      private com.sun.jdi.VirtualMachine jvm  
      private java.util.Map newClassFiles  
      private com.sun.jdi.request.MethodEntryRequest request  
      private Trigger trigger  
      private static java.lang.String TRIGGER_NAME  
    • Constructor Summary

      Constructors 
      Constructor Description
      HotSwapper​(int port)
      Connects to the JVM.
      HotSwapper​(java.lang.String port)
      Connects to the JVM.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void deleteEventRequest​(com.sun.jdi.request.EventRequestManager manager, com.sun.jdi.request.MethodEntryRequest request)  
      private com.sun.jdi.connect.Connector findConnector​(java.lang.String connector)  
      (package private) void hotswap()  
      private static com.sun.jdi.request.MethodEntryRequest methodEntryRequests​(com.sun.jdi.request.EventRequestManager manager, java.lang.String classpattern)  
      void reload​(java.lang.String className, byte[] classFile)
      Reloads a class.
      void reload​(java.util.Map classFiles)
      Reloads a class.
      private void reload2​(java.util.Map map, java.lang.String msg)  
      private void startDaemon()  
      private com.sun.jdi.ReferenceType toRefType​(java.lang.String className)  
      (package private) com.sun.jdi.event.EventSet waitEvent()  
      • Methods inherited from class java.lang.Object

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

      • jvm

        private com.sun.jdi.VirtualMachine jvm
      • request

        private com.sun.jdi.request.MethodEntryRequest request
      • newClassFiles

        private java.util.Map newClassFiles
      • TRIGGER_NAME

        private static final java.lang.String TRIGGER_NAME
    • Constructor Detail

      • HotSwapper

        public HotSwapper​(int port)
                   throws java.io.IOException,
                          com.sun.jdi.connect.IllegalConnectorArgumentsException
        Connects to the JVM.
        Parameters:
        port - the port number used for the connection to the JVM.
        Throws:
        java.io.IOException
        com.sun.jdi.connect.IllegalConnectorArgumentsException
      • HotSwapper

        public HotSwapper​(java.lang.String port)
                   throws java.io.IOException,
                          com.sun.jdi.connect.IllegalConnectorArgumentsException
        Connects to the JVM.
        Parameters:
        port - the port number used for the connection to the JVM.
        Throws:
        java.io.IOException
        com.sun.jdi.connect.IllegalConnectorArgumentsException
    • Method Detail

      • findConnector

        private com.sun.jdi.connect.Connector findConnector​(java.lang.String connector)
                                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • methodEntryRequests

        private static com.sun.jdi.request.MethodEntryRequest methodEntryRequests​(com.sun.jdi.request.EventRequestManager manager,
                                                                                  java.lang.String classpattern)
      • deleteEventRequest

        private void deleteEventRequest​(com.sun.jdi.request.EventRequestManager manager,
                                        com.sun.jdi.request.MethodEntryRequest request)
      • reload

        public void reload​(java.lang.String className,
                           byte[] classFile)
        Reloads a class.
        Parameters:
        className - the fully-qualified class name.
        classFile - the contents of the class file.
      • reload

        public void reload​(java.util.Map classFiles)
        Reloads a class.
        Parameters:
        classFiles - a map between fully-qualified class names and class files. The type of the class names is String and the type of the class files is byte[].
      • toRefType

        private com.sun.jdi.ReferenceType toRefType​(java.lang.String className)
      • reload2

        private void reload2​(java.util.Map map,
                             java.lang.String msg)
      • startDaemon

        private void startDaemon()
      • waitEvent

        com.sun.jdi.event.EventSet waitEvent()
                                      throws java.lang.InterruptedException
        Throws:
        java.lang.InterruptedException
      • hotswap

        void hotswap()