ClassLister

harja 27.09.04 13:24

Listaa ajonaikaisesti käytössä olevat luokat

 Tekstiversio  Arvo: 14 (26 ääntä)  Äänestä: +  -
/*
 * Created on 27.9.2004
 * Mitä kivaa löytyikään ClassLoaderin sorsaa lukiessa... :)
 * Kyseinen luokka sisältää memberin private Vector classes jossa on listattuna
 * kaikki ladatut luokat. Sen listaamiseksi tarvittiin hieman kikkailua, mutta onnistui aika kivasti.
 */

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Vector;

/**
 * @author mharju
 */

public class ClassLister {
        public static Iterator listClasses(ClassLoader c) throws
                NoSuchFieldException, IllegalAccessException
        {
                // Otetaan se lataaja
                Class loader=c.getClass();
               
                // Mennään niin kauan alaspäin hierarkiaa, kunnes saadaan tuo luokka missä on
                // määritelty private Vector classes (java.lang.ClassLoader)
                while(loader != java.lang.ClassLoader.class) {
                        loader=loader.getSuperclass();
                }
               
                // Otetaan se kenttä
                Field classes_field=loader.getDeclaredField("classes");
               
                // Asetetaan se saatavaksi
                classes_field.setAccessible(true);
               
                // Muunnetaan oikeaan muotoon
                Vector classes=(Vector)classes_field.get(c);
               
                // Ja palautetaan iteraattori siihen
                return classes.iterator();
        }
       
        public static void main(String[] args) {
                // Luodaan pari oliota
                Ykkone yks=new Ykkone();
                Kakkone kaks=new Kakkone();
               
                // Otetaan classloaderi mille tuo listaus tehdään (tämän luokan classloader siis)
                ClassLoader loader=ClassLister.class.getClassLoader();
                while(loader != null) {
                        System.out.println("Loaderi: "+loader);
                        try {
                                // iteroidaan kentät läpi
                                for(Iterator i=listClasses(loader); i.hasNext();)
                                        System.out.println("\t "+i.next());
                        } catch(NoSuchFieldException e) {
                        } catch(IllegalAccessException e) {
                        }
                        // mennään vanhempaan
                        loader=loader.getParent();
                }              
        }
}

class Ykkone {
        public Ykkone() { System.out.println("Ykkönen luotu!"); }
}

class Kakkone {
        public Kakkone() { System.out.println("Kakkone luotu!"); }
}

Ztane 20:06 27.9.04 
1337
Ztane 10:47 1.10.04 
No kuka anto miinuksen? törkeetä!
harja 15:50 1.10.04 
Mulla on hyvä veikkaus mutta en lähde spekuloimaan :D Jotkut ilmeisesti ottaa hieman liian tosissaan...