MemberInfo.java



/** クラスのメンバーの情報を調べる MemberInfo */
import java.lang.reflect.*;
public class MemberInfo {

 /** 実行時に最初に呼び出されるメソッド */
    public static void main( String argv[] ) {
        try {
            if( argv.length != 1 ) {
                System.err.println( "Usage:java MemberInfo ClassName" );
                System.exit(0);
            }
            Class cls = Class.forName( argv[0] );  // クラス情報のオブジェクト
            Package pkg = cls.getPackage();        // 所属パッケージ
            Class sup = cls.getSuperclass();       // スーパークラス
            Field[] fields = cls.getDeclaredFields();    // フィールドの一覧
            Constructor[] constructors = cls.getConstructors();  // コンストラクタの一覧
            Method[] methods = cls.getDeclaredMethods(); // メソッドの一覧

            System.out.println( "Name: " + cls.getName() );
            if( sup != null )
                System.out.println( "extends " + sup.getName() );
            if( pkg != null )
                System.out.println( "Package: " + pkg.getName() );
            System.out.println( "Fiels:" );
            for( int i=0; i<fields.length; i++ ) {
                System.out.println( "\t"+ getModifiedName( fields[i] ) );
            }
            System.out.println( "Constructor:" );
            for( int i=0; i<constructors.length; i++ ) {
                System.out.println( "\t"+ getModifiedName( constructors[i] ) );
            }
            System.out.println( "Methods:" );
            for( int i=0; i<methods.length; i++ ) {
                System.out.println( "\t"+ getModifiedName( methods[i] ) );
            }
        }
        catch( SecurityException e ){
             System.err.println( "Can not access the class" );
             System.exit(0);
        }
        catch( ClassNotFoundException e ){
             System.err.println( "No such class" );
             System.exit(0);
        }
    }

 /** メンバーの修飾子の情報を整形して返すメソッド */
    public static String getModifiedName( Member member ) {
        int modifiers = member.getModifiers();  // 修飾子の情報
        StringBuffer value = new StringBuffer("");
        if( Modifier.isPublic( modifiers ) ) value.append("public "); 
        if( Modifier.isProtected( modifiers ) ) value.append("protected "); 
        if( Modifier.isPrivate( modifiers ) ) value.append("private "); 
        if( Modifier.isAbstract( modifiers ) ) value.append("abstract "); 
        if( Modifier.isNative( modifiers ) ) value.append("native "); 
        if( Modifier.isSynchronized( modifiers ) ) value.append("synchronized "); 
        if( Modifier.isTransient( modifiers ) ) value.append("transient "); 
        if( Modifier.isVolatile( modifiers ) ) value.append("volatile "); 
        if( Modifier.isStatic( modifiers ) ) value.append("static "); 
        if( Modifier.isFinal( modifiers ) ) value.append("final "); 
        if( member instanceof Field ) {
            Class cls = ((Field)member).getType();  // メンバーの型
            value.append( cls.getName() );
            value.append( " " );
            value.append( member.getName() );
            return value.toString();
        }
        else {
            Class[] prms;
            if( member instanceof Method ) {
                Class cls = ((Method)member).getReturnType();  // メソッドの返値の型
                prms = ((Method)member).getParameterTypes();
                value.append( cls.getName() );
                value.append( " " );
            }
            else {
                prms = ((Constructor)member).getParameterTypes();
            }
            value.append(member.getName());
            value.append( "(" );
            StringBuffer args = new StringBuffer("");  // 引数の型
            for( int j=0; j<prms.length; j++ ) {
                args.append( prms[j].getName() );
                if( j != prms.length-1 ) args.append( ", " );
            }
            value.append( args.toString() );
            value.append( ")" );
            return value.toString();
        }
    }
}