import java.lang.reflect.*; /** Ohjelma, joka tulostaa kuvauksen annetusta luokasta */ public class ShowClass { /** main-metodi. Tulostaa tietoja määritellystä luokasta */ public static void main(String[] args) throws ClassNotFoundException { Class c = Class.forName(args[0]); print_class(c); } /** Näytetään luokan tai rajapinnan määreet, nimi, yliluokka ja rajapinnat. * Sitten luetellaan kaikki konstruktorit, kentät ja metodit. */ public static void print_class(Class c) { // Tulostetaan määreet, tyyppi (luokka vai rajapinta), nimi ja yliluokka. if (c.isInterface()) { // Määreisiin tulee mukaan "interface"-määre... System.out.print(Modifier.toString(c.getModifiers()) + c.getName()); } else System.out.print(Modifier.toString(c.getModifiers()) + " class " + c.getName() + " extends " + c.getSuperclass().getName()); // Tulostetaan luokan tai rajapinnan rajapinnat ja sen // perimät rajapinnat. Class[] interfaces = c.getInterfaces(); if ((interfaces != null) && (interfaces.length > 0)) { if (c.isInterface()) System.out.println(" extends "); else System.out.print(" implements "); for(int i = 0; i < interfaces.length; i++) { if (i > 0) System.out.print(", "); System.out.print(interfaces[i].getName()); } } System.out.println(" {"); // Aloitetaan jäsenlistaus. // Etsitään ja tulostetaan luokan jäsenet. System.out.println(" // Constructors"); Constructor[] constructors = c.getDeclaredConstructors(); // Tulostetaan konstruktorit. for(int i = 0; i < constructors.length; i++) print_method_or_constructor(constructors[i]); System.out.println(" // Fields"); Field[] fields = c.getDeclaredFields(); // Pyydetään kentät. for(int i = 0; i < fields.length; i++) // Tulostetaan ne. print_field(fields[i]); System.out.println(" // Methods"); Method[] methods = c.getDeclaredMethods(); // Pyydetään metodit. for(int i = 0; i < methods.length; i++) // Tulostetaan ne. print_method_or_constructor(methods[i]); System.out.println("}"); // Luokan jäsenten listauksen loppu. } /** Palauttaa rajapinnan tai perustietotyypin nimen. Osaa * käsitellä taulukot */ public static String typename(Class t) { String brackets = ""; while(t.isArray()) { brackets += "[]"; t = t.getComponentType(); } return t.getName() + brackets; } /** Palauttaa määreet merkkijonossa. Ottaa huomioon asettelun. */ public static String modifiers(int m) { if (m == 0) return ""; else return Modifier.toString(m) + " "; } /** Tulostetaan kentän määreet, tyyppi, ja nimi */ public static void print_field(Field f) { System.out.println(" " + modifiers(f.getModifiers()) + typename(f.getType()) + " " + f.getName() + ";"); } /** Tulostetaan metodin tai konstruktorin määreet, paluuarvon tyyppi, nimi * parametrien tyypit ja poikkeukset. Huomaa, että Member-rajapintaa * käyttämällä tällä metodilla voi käsitellä sekä Method- että * Constructor-olioita. */ public static void print_method_or_constructor(Member member) { Class returntype=null, parameters[], exceptions[]; if (member instanceof Method) { Method m = (Method) member; returntype = m.getReturnType(); parameters = m.getParameterTypes(); exceptions = m.getExceptionTypes(); } else { Constructor c = (Constructor) member; parameters = c.getParameterTypes(); exceptions = c.getExceptionTypes(); } System.out.print(" " + modifiers(member.getModifiers()) + ((returntype!=null)? typename(returntype)+" " : "") + member.getName() + "("); for(int i = 0; i < parameters.length; i++) { if (i > 0) System.out.print(", "); System.out.print(typename(parameters[i])); } System.out.print(")"); if (exceptions.length > 0) System.out.print(" throws "); for(int i = 0; i < exceptions.length; i++) { if (i > 0) System.out.print(", "); System.out.print(typename(exceptions[i])); } System.out.println(";"); } }