Class.forName() ne chargera pas une classe, qu'elle soit ou non dans le classpath. Elle ne renverra qu'un handle vers une classe déjà chargée.
Une classe est chargée de deux manières principales :
1) La classe est référencée dans les déclarations d'importation (java.lang.* est importée automatiquement, de sorte que toutes les classes du paquetage java.lang sont chargées dès le départ).
2) Une classe est chargée à l'aide d'un appel d'un ClassLoader, auquel cas toutes ses dépendances sont résolues et chargées également.
Ainsi, si vous essayez de charger une classe en dehors du classpath, ou avec des dépendances en dehors du classpath, vous devez sous-classer ClassLoader et lui indiquer comment charger vos classes et leurs dépendances.
Voir la spécification de ClassLoader ici : http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html
Il existe également des sous-classes de ClassLoader prêtes à l'emploi qui peuvent faire ce que vous voulez, comme URL ClassLoader, qui vous permet simplement de faire pointer l'instance de ClassLoader sur le chemin d'accès et de charger toutes les classes qui s'y trouvent.