#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