Class ClassFile


  • public class ClassFile
    extends java.lang.Object
    An object that represents the Java™ "class file" format.

    ClassFile(InputStream) creates a ClassFile object from the bytecode read from the given InputStream.

    store(OutputStream) generates Java™ bytecode which is suitable for being processed by a Java™ virtual machine.

    • Field Detail

      • constantPool

        public final java.util.List constantPool
      • accessFlags

        public final short accessFlags
      • thisClass

        public final short thisClass
      • superclass

        public final short superclass
      • interfaces

        public final short[] interfaces
      • fieldInfos

        public final java.util.List fieldInfos
      • methodInfos

        public final java.util.List methodInfos
    • Constructor Detail

      • ClassFile

        public ClassFile​(short accessFlags,
                         java.lang.String thisClassFd,
                         java.lang.String superclassFd,
                         java.lang.String[] interfaceFds)
        Construct from parsed components.
        Parameters:
        accessFlags - as defined by Mod
        thisClassFd - the field descriptor for this class
        superclassFd - the field descriptor for the extended class (e.g. "Ljava/lang/Object;")
        interfaceFds - the field descriptors for the implemented interfaces
      • ClassFile

        public ClassFile​(java.io.InputStream inputStream)
                  throws java.io.IOException
        Read "class file" data from a InputStream and construct a ClassFile object from it.

        If the ClassFile is created with this constructor, then most modifying operations lead to a UnsupportedOperationException; only fields, methods and attributes can be added.

        Parameters:
        inputStream -
        Throws:
        java.io.IOException
        java.lang.ClassFormatError
    • Method Detail

      • addSourceFileAttribute

        public void addSourceFileAttribute​(java.lang.String sourceFileName)
        Adds a "SourceFile" attribute to this class file. (Does not check whether one exists already.)
        Parameters:
        sourceFileName -
      • addDeprecatedAttribute

        public void addDeprecatedAttribute()
      • getInnerClassesAttribute

        public ClassFile.InnerClassesAttribute getInnerClassesAttribute()
        Find the "InnerClasses" attribute of this class file
        Returns:
        null if this class has no "InnerClasses" attribute
      • addInnerClassesAttributeEntry

        public void addInnerClassesAttributeEntry​(ClassFile.InnerClassesAttribute.Entry e)
        Create an "InnerClasses" attribute if it does not exist, then add the given entry to the "InnerClasses" attribute.
        Parameters:
        e -
      • getThisClassName

        public java.lang.String getThisClassName()
        Returns:
        The fully qualified name of this class, e.g. "pkg1.pkg2.Outer$Inner"
      • setVersion

        public void setVersion​(short majorVersion,
                               short minorVersion)
        Sets the major and minor class file version numbers (JVMS 4.1). The class file version defaults to the JDK 1.1 values (45.3) which execute on virtually every JVM.
        Parameters:
        majorVersion -
        minorVersion -
      • getMajorVersion

        public short getMajorVersion()
        Returns the current major class file version number.
      • getMinorVersion

        public short getMinorVersion()
        Returns the current minor class file version number.
      • addConstantClassInfo

        public short addConstantClassInfo​(java.lang.String typeFd)
        Return the constant index number for a "CONSTANT_Class_info" structure to the class file. If the class hasn't been added before, add it to the constant pool. Otherwise return the constant number for that element of the pool.
        See Also:
        JVM specification, section 4.4.1
      • addConstantFieldrefInfo

        public short addConstantFieldrefInfo​(java.lang.String classFd,
                                             java.lang.String fieldName,
                                             java.lang.String fieldFd)
        Add a "CONSTANT_Fieldref_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.2
      • addConstantMethodrefInfo

        public short addConstantMethodrefInfo​(java.lang.String classFd,
                                              java.lang.String methodName,
                                              java.lang.String methodMd)
        Add a "CONSTANT_Methodref_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.2
      • addConstantInterfaceMethodrefInfo

        public short addConstantInterfaceMethodrefInfo​(java.lang.String classFd,
                                                       java.lang.String methodName,
                                                       java.lang.String methodMd)
        Add a "CONSTANT_InterfaceMethodref_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.2
      • addConstantStringInfo

        public short addConstantStringInfo​(java.lang.String string)
        Add a "CONSTANT_String_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.3
      • addConstantIntegerInfo

        public short addConstantIntegerInfo​(int value)
        Add a "CONSTANT_Integer_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.4
      • addConstantFloatInfo

        public short addConstantFloatInfo​(float value)
        Add a "CONSTANT_Float_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.4
      • addConstantLongInfo

        public short addConstantLongInfo​(long value)
        Add a "CONSTANT_Long_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.5
      • addConstantDoubleInfo

        public short addConstantDoubleInfo​(double value)
        Add a "CONSTANT_Double_info" structure to the class file.
        See Also:
        JVM specification, section 4.4.5
      • addConstantUtf8Info

        public short addConstantUtf8Info​(java.lang.String s)
        Adds a "CONSTANT_Utf8_info" structure to the class file if no equal entry exists.
        Returns:
        The index of the already existing or newly created entry
        See Also:
        JVM specification, section 4.4.7
      • addFieldInfo

        public ClassFile.FieldInfo addFieldInfo​(short accessFlags,
                                                java.lang.String fieldName,
                                                java.lang.String fieldTypeFd,
                                                java.lang.Object optionalConstantValue)
      • addMethodInfo

        public ClassFile.MethodInfo addMethodInfo​(short accessFlags,
                                                  java.lang.String methodName,
                                                  java.lang.String methodMd)
      • getConstantClassName

        public java.lang.String getConstantClassName​(short index)
        Parameters:
        index - Index to a CONSTANT_Class_info in the constant pool
        Returns:
        The name of the denoted class in "internal form" (see JVMS 4.2)
      • getConstantUtf8

        public java.lang.String getConstantUtf8​(short index)
        Parameters:
        index - Index to a CONSTANT_Utf8_info in the constant pool
        Returns:
        The string represented by the structure
      • store

        public void store​(java.io.OutputStream os)
                   throws java.io.IOException
        Write ClassFile to an OutputStream, in "class file" format.

        Notice that if an IOException is thrown, the class file is probably written incompletely and thus invalid. The calling method must take care of this situation, e.g. by closing the output stream and then deleting the file.

        Parameters:
        os -
        Throws:
        java.io.IOException
      • getSourceResourceName

        public static java.lang.String getSourceResourceName​(java.lang.String className)
        Construct the name of a resource that could contain the source code of the class with the given name.

        Notice that member types are declared inside a different type, so the relevant source file is that of the outermost declaring class.

        Parameters:
        className - Fully qualified class name, e.g. "pkg1.pkg2.Outer$Inner"
        Returns:
        the name of the resource, e.g. "pkg1/pkg2/Outer.java"
      • getClassFileResourceName

        public static java.lang.String getClassFileResourceName​(java.lang.String className)
        Construct the name of a resource that could contain the class file of the class with the given name.
        Parameters:
        className - Fully qualified class name, e.g. "pkg1.pkg2.Outer$Inner"
        Returns:
        the name of the resource, e.g. "pkg1/pkg2/Outer$Inner.class"
      • toByteArray

        public byte[] toByteArray()
        Return the byte code of this ClassFile as a byte array.