Class ClassWriter


public final class ClassWriter extends ClassVisitor
A ClassVisitor that generates classes in bytecode form, that is, a byte array conforming to the Java class file format.

It can be used alone, to generate a Java class "from scratch", or with one or more ClassReader and adapter class visitor to generate a modified class from one or more existing Java classes.

  • Field Details

    • code

      @NonNull public final byte[] code
      The class bytecode from which this class writer will generate a new/modified class.
  • Constructor Details

    • ClassWriter

      public ClassWriter(@NonNull ClassReader classReader)
      Initializes a new class writer, applying the following two optimizations that are useful for "mostly add" bytecode transformations:
      • The constant pool from the original class is copied as is in the new class, which saves time. New constant pool entries will be added at the end if necessary, but unused constant pool entries won't be removed.
      • Methods that are not transformed are copied as is in the new class, directly from the original class bytecode (i.e. without emitting visit events for all the method instructions), which saves a lot of time. Untransformed methods are detected by the fact that the ClassReader receives MethodVisitor objects that come from a ClassWriter (and not from any other ClassVisitor instance).
      Parameters:
      classReader - the ClassReader used to read the original class; it will be used to copy the entire constant pool from the original class and also to copy other fragments of original bytecode where applicable
  • Method Details

    • getClassVersion

      public int getClassVersion()
    • getInternalClassName

      public String getInternalClassName()
    • visit

      public void visit(int version, int access, @NonNull String name, @NonNull ClassInfo additionalInfo)
      Description copied from class: ClassVisitor
      Visits the header of the class.
      Overrides:
      visit in class ClassVisitor
      Parameters:
      version - the class version
      access - the class's access flags (see Access)
      name - the internal name of the class
      additionalInfo - additional class information
    • visitInnerClass

      public void visitInnerClass(@NonNull String name, @Nullable String outerName, @Nullable String innerName, int access)
      Description copied from class: ClassVisitor
      Visits information about an inner class, which is not necessarily a member of the class being visited.
      Overrides:
      visitInnerClass in class ClassVisitor
      Parameters:
      name - the internal name of an inner class
      outerName - the internal name of the class to which the inner class belongs; null for not member classes
      innerName - the (simple) name of the inner class inside its enclosing class; null for anonymous inner classes
      access - the access flags of the inner class as originally declared in the enclosing class
    • visitField

      @NonNull public FieldVisitor visitField(int access, @NonNull String name, @NonNull String desc, @Nullable String signature, @Nullable Object value)
      Description copied from class: ClassVisitor
      Visits a field of the class.
      Overrides:
      visitField in class ClassVisitor
      Parameters:
      access - the field's access flags (see Access)
      name - the field's name
      desc - the field's descriptor (see JavaType)
      signature - the field's signature; null when the field's type does not use generic types
      value - the field's initial value; null when the field does not have an initial value; otherwise, must be an Integer, a Float, a Long, a Double or a String (for int, float, long or String fields respectively); this parameter is only used for static fields; its value is ignored for non static fields, which must be initialized through bytecode instructions in constructors or methods
      Returns:
      a visitor to visit field annotations and attributes, or null if this class visitor is not interested in visiting these annotations and attributes
    • visitMethod

      @NonNull public MethodWriter visitMethod(int access, @NonNull String name, @NonNull String desc, @Nullable String signature, @Nullable String[] exceptions)
      Description copied from class: ClassVisitor
      Visits a method of the class. This method must return a new MethodVisitor instance (or null) each time it is called, i.e., it should not return a previously returned visitor.
      Overrides:
      visitMethod in class ClassVisitor
      Parameters:
      access - the method's access flags (see Opcodes)
      name - the method's name
      desc - the method's descriptor (see JavaType)
      signature - the method's signature, null if the method parameters, return type and exceptions do not use generic types
      exceptions - the internal names of the method's exception classes
      Returns:
      an object to visit the byte code of the method, or null if this class visitor is not interested in visiting the code of this method
    • toByteArray

      @NonNull public byte[] toByteArray()
      Returns the bytecode of the class that was built with this class writer.
      Overrides:
      toByteArray in class ClassVisitor
    • addInvokeDynamicReference

      @NonNull public DynamicItem addInvokeDynamicReference(@NonNull String name, @NonNull String desc, @NonNull MethodHandle bsm, @NonNull Object... bsmArgs)
    • isJava6OrNewer

      public boolean isJava6OrNewer()