Listing 4: A utility for extracting class declaration information from a Java class file

#include <iostream>
#include "JavaClassFile.h"

using namespace std;

wstring MassageType( const wstring &wstrType );

int main(int argc, char **argv)
{

    if ( argc < 2 )
    {
        wcerr << _U("syntax: ClassDump <filename>") << endl;
        exit(0);
    }

    JavaClassFile cfile(argv[1]);

    if ( cfile.IsOpen() )
    {
        WORD wAccess;
        WORD wCount;

        wAccess = cfile.GetClassAccess();

        if ( wAccess & JavaClassFile::ACC_PUBLIC) 
            wcout << _U("public ");
        if ( wAccess & JavaClassFile::ACC_FINAL) 
            wcout << _U("final ");
        if ( wAccess & JavaClassFile::ACC_ABSTRACT) 
            wcout << _U("abstract ");
        if ( wAccess & JavaClassFile::ACC_INTERFACE) 
            wcout << _U("interface ");
        else
            wcout << _U("class ");

        wcout << MassageType(cfile.GetClassName()) << _U(" ");

        wCount = cfile.GetInterfaceCount();
        if ( wCount )
        {
        wcout << _U("implements ");

            for ( WORD wCur = 0; wCur < wCount; wCur++ )

            {
                wcout << MassageType(cfile.GetInterfaceName(wCur));
                if ( wCur == wCount-1 )
                    wcout << _U(" ");
                else
                    wcout << _U(", ");
            }
        }

        wcout << _U("extends ") <<
            MassageType(cfile.GetSuperClassName()) << endl;
        wcout << _U("{") << endl << endl;
        wCount = cfile.GetFieldCount();
        if ( wCount )
        {
            wcout << _U("\t// Fields") << endl;

            for ( WORD wCur = 0; wCur < wCount; wCur++ )
            {
                wcout << _U("\t");

                WORD wAccess = cfile.GetFieldAccess(wCur);

                if ( wAccess & JavaClassFile::ACC_PUBLIC) 
                    wcout << _U("public ");
                if ( wAccess & JavaClassFile::ACC_PRIVATE) 
                    wcout << _U("private ");
                if ( wAccess & JavaClassFile::ACC_PROTECTED) 
                    wcout << _U("protected ");
                if ( wAccess & JavaClassFile::ACC_STATIC) 
                    wcout << _U("static ");
                if ( wAccess & JavaClassFile::ACC_FINAL) 
                    wcout << _U("final ");
                if ( wAccess & JavaClassFile::ACC_VOLATILE) 
                    wcout << _U("volatile ");
                if ( wAccess & JavaClassFile::ACC_TRANSIENT) 
                    wcout << _U("transient ");

                wcout << MassageType(cfile.GetFieldType(wCur))
                      << _U(" ");
                wcout << cfile.GetFieldName(wCur) << _U(";") << endl;
            }
            wcout << endl;
        }

        wCount = cfile.GetMethodCount();
        if ( wCount )
        {
            wcout << _U("\t// Methods") << endl;
 
            for ( WORD wCur = 0; wCur < wCount; wCur++ )
            {
                wcout << _U("\t"); 
                WORD wAccess = cfile.GetMethodAccess(wCur);

                if ( wAccess & JavaClassFile::ACC_PUBLIC) 
                    wcout << _U("public ");
                if ( wAccess & JavaClassFile::ACC_PRIVATE) 
                    wcout << _U("private ");
                if ( wAccess & JavaClassFile::ACC_PROTECTED) 
                    wcout << _U("protected ");
                if ( wAccess & JavaClassFile::ACC_STATIC) 
                    wcout << _U("static ");
                if ( wAccess & JavaClassFile::ACC_FINAL) 
                    wcout << _U("final ");
                if ( wAccess & JavaClassFile::ACC_ABSTRACT) 
                    wcout << _U("abstract ");
                if ( wAccess & JavaClassFile::ACC_SYNCHRONIZED) 
                    wcout << _U("synchronized ");
                if ( wAccess & JavaClassFile::ACC_NATIVE) 
                    wcout << _U("native ");

                wcout << MassageType(cfile.GetMethodReturnType(wCur))
                      << _U(" ");
                wcout << cfile.GetMethodName(wCur) << _U("(");

                WORD wArgCount = cfile.GetMethodArgCount( wCur );
                if ( wArgCount )
                {
                    wcout << _U(" ");

                    for ( WORD wCurArg = 0;
                          wCurArg < wArgCount;
                          wCurArg++ )
                    {
                        wcout << MassageType(
                            cfile.GetMethodArgType(wCur, wCurArg));
                        if ( wCurArg != (wArgCount-1) )
                            wcout << _U(",");
                        wcout << _U(" ");
                    }
                }
                wcout << _U(");") << endl;
            }
            wcout << endl;
        }
        wcout << _U("}");
    }
    else
    {
        cout << argv[1] << " is not a valid class file" << endl;
    }
    return 0;
}

wstring MassageType( const wstring &crwstrType )
{
    wstring wstrT = crwstrType;

    int nIndex = wstrT.find(_U('/'));
    while ( nIndex != wstring::npos )
    {
        wstrT[nIndex] = _U('.');
        nIndex = wstrT.find(_U('/'));
    }

    return wstrT;
}
//End of File