rlanhellas:
Bom, ótima explicação, acho que ficamos por aqui neste tópico, o resto é só mais estudo e mais estudo.
A insistência no ClassLoader é porque estou estudando seu conceito, e tentando entender o seu real objetivo.
Ah tá. Vou dar uma explicada rápida então.
O Classloader é o mecanismo de carregamento de classes. A grande sacada é que você pode ter vários desses mecanismos para carregá-las e não é necessário que os bytecodes estejam fisicamente em um arquivo (você pode carregar uma classe de um outro servidor, por exemplo).
Além disso, Classloaders podem ter hierarquias, delegando o carregamento das classes para o Classloader pai, caso ele saiba como carregá-la. É com base nessa hierarquia de Classloaders que são feitos os servidores de aplicação. O JBoss 5, por exemplo, cria um Classloader para cada aplicação que está embaixo de um Classloader global e delega a este o carregamento das classes - por isso ele acaba carregando o hibernate dele em vez do hibernate no WEB-INF/lib. Você pode mudar esse comportamento, fazendo ele delegar ao pai somente se o classloader filho não puder carregar a classe (geralmente se faz isso quando aplicações do tomcat são migradas pro JBoss, já que o tomcat utiliza esse comportamento por padrão).
O Classloader é também uma das variáveis para comparações de classes. Para duas classes serem iguais, elas devem, também, terem sido carregadas pelo mesmo Classloader (por isso acontecem alguns erros malucos do tipo “A não é compatível com B, sendo que A implementa B”).
O fato de ser possível carregar classes usando outros classloaders é que faz o Eclipse poder manter versões diferentes dos mesmos plugins, isolar plugins de acessarem classes de outros plugins e mais algumas outras coisas. O OSGi, que é usado no Eclipse e agora também está implementado no novo JBoss 7, se utiliza muito desse comportamento para os relacionamentos entre módulos.
Não sei em que pé você está nos estudos de classloader, de repente já tem noção disso que escrevi, mas pode servir pra outros no fórum.