2008-09-24 1 views
2

J'ai essayé, mais obtenir un ClassNotFoundException lorsque vous appelez:Est-il possible de définir un Java ClassLoader qui renvoie des classes complètement différentes de celles demandées?

Class.forName("com.AClass", false, mySpecialLoader) 
+0

pouvez-vous élaborer un peu plus? – Thilo

+0

besoin de plus d'informations. Vous pourriez obtenir classnotfound pour tant de raisons ... –

+0

Désolé, nous n'avons pas reçu de commentaires! J'ai étendu ClassLoader, et substitué loadClass (String, boolean). Fondamentalement, dans le cas exceptionnel, il retourne juste un objet Class existant. –

Répondre

5

Le ClassLoader devra appeler defineClass pour obtenir la classe. Selon le JavaDoc pour defineClass:

Si le nom n'est pas nul, il doit être égal au nom binaire de la classe spécifiée par le tableau d'octets.

Si le nom est nul, il l'obtiendra du bytecode. Vous pouvez donc renvoyer n'importe quelle classe si elle s'appelle com.AClass. En d'autres termes, vous pourriez avoir plusieurs versions de com.AClass. Vous pourriez même utiliser quelque chose comme JavaAssist pour créer une classe à la volée.

Mais cela n'explique pas le ClassNotFoundException - il semble que votre chargeur de classe ne retourne rien.

1

Il est impossible de renvoyer une classe nommée différemment de celle demandée. Cependant, il est possible d'utiliser des outils de manipulation bytecode comme ASM pour renommer automatiquement la classe que vous voulez retourner à celle demandée.

Questions connexes