L'utilisation correcte de chargeur de classe (en particulier dans Android)
J'ai lu quelques documentations sur les chargeurs de classe, mais im toujours pas sûr de savoir où et pourquoi ils sont nécessaires. L'API Android dit:
Charge des classes et des ressources à partir d'un
référentiel. Un ou plusieurs chargeurs de classe
sont installés au moment de l'exécution. Ce sont
consulté à chaque fois que le système d'exécution
besoin d'une classe spécifique qui n'est pas encore
disponible en mémoire.
Donc, si je comprends bien, il peut y avoir beaucoup de classlaoders qui sont responsables du chargement de nouvelles classes. Mais comment le système décide de l'utiliser? Et dans lequel la situation, si un développeur instancier un nouveau chargeur de classe?
Dans l'API Android pour Intention il existe une méthode
public void setExtrasClassLoader (ClassLoader loader)
La description dit:
Définit le chargeur de classe qui sera utilisée
lorsque unmarshalling tout Parcelable
les valeurs de la extras de cette Intention.
Je peux donc définir il y a un spécial chargeur de classe pour que je puisse passer de l'objet avec une Intention qui ne sont pas définis dans la réception d'activité? Un exemple:
Si Une activité qui est situé dans Un Projet (dans Eclipse) définit un objet qui je veux envoyer à l'Activité B dans le Projet B à l'aide de putExtra de l'Intention de l'objet. Si cet objet qui est de l'envoyer sur l'Intention n'est pas défini (le code source dans un projet B), alors il existe un NoClassDefFoundException. Donc, puis-je utiliser la méthode setExtraClassloader pour éviter cette exception? Si oui, comment puis-je décider qui du chargeur de classe de l'objet-je passer? Et comment instancier correctement?
OriginalL'auteur | 2010-05-09
Vous devez vous connecter pour publier un commentaire.
En général, vous n'avez pas besoin de toucher au système de classloader.
Après environ une décennie d'expérience en programmation Java. 🙂
Non, car Un Projet et le Projet B ne peut pas partager le code. Mettre la classe dont vous avez besoin dans les deux projets. Ou utiliser un service à distance de l'interface avec AIDL au lieu de
Intents
et extras. Ou de ne pas utiliser une classe personnalisée, mais plutôt de traiter l'objet comme une structure de données (par exemple, l'utilisation d'un simpleHashMap
deStrings
ou quelque chose).Pour faire vraiment de fantaisie à l'intérieur d'un même projet.
Classe personnalisée chargeurs généralement de créer autant de problèmes qu'elles n'en résolvent, ils ne sont donc pas un bon endroit pour commencer quand vous essayez de résoudre un problème. Si vous voulez vraiment être confus, essayer de découvrir ce Thread.setContextClassLoader. 🙂
parce qu'Un Projet et le Projet B ne peut pas partager le code... Eeeh... Mais qu'en est
createPackageContext
méthode que j'ai utilisé ici: stackoverflow.com/questions/5743485/...Bien que cette technique fonctionne apparemment, je ne le recommande pas. Vous n'avez aucun moyen d'assurer que les deux projets sont à l'aide de la même base de code, sauf si vous envisagez sur la tenue d'une arme à feu à la tête de tous vos utilisateurs. Vous devez être en mesure de faire face avec les deux projets en cours de mis à jour de manière indépendante. Qui nécessite une API conçue pour être robuste face à des changements de version, et je doute que ce soit possible par le chargement des classes d'autres projets.
OriginalL'auteur CommonsWare
C'est une réponse tardive, mais j'espère que ça aidera d'autres personnes.
Chargeurs de classes en général, sont utilisés pour le chargement de l'exécutable Java code lors de l'exécution. Un bon exemple de ceci serait un plugin qui est téléchargé à partir d'internet. Vous pouvez prendre les données binaires à partir d'un fichier de classe, la charger, et appeler les fonctions de l'intérieur en tant que de besoin. Vous n'avez, bien sûr, besoin d'utiliser une interface ou une classe abstraite qui est connu par le programme appelant de sorte qu'il sait comment utiliser la classe.
Un classloader personnalisé est utilisé lorsque le binaire de données de la classe n'est pas accessible dans un manoir typique. Par exemple, si vous avez un périphérique bluetooth qui contient un fichier de classe avec le code implémentant une interface, vous devez écrire un classloader personnalisé pour charger la classe des données via l'interface bluetooth.
Une autre raison, vous pouvez écrire un classloader personnalisé est si vous voulez changer la façon dont la classe chargée accède à d'autres classes. Vous pouvez limiter les classes internes chargés de la classe a accès à de ou même écrire vos propres classes, changer le comportement d'une classe interne. Par exemple, si la classe chargée utilise le Java.io.Fichier de classe, vous devrez peut-être forcer à utiliser une classe interne pour accéder à des fichiers d'une manière différente.
En bref, lorsque vous écrivez un classloader personnalisé, vous changez la façon dont une classe est chargée, ainsi que la façon dont la classe chargée va charger toutes les autres classes.
OriginalL'auteur Mick
Chargeurs de classes ne sont pas difficile à comprendre, au moins dans le stock de Java de l'espace. (Je peux vous enseigner le système de ClassLoader en 90 minutes--je le fais tout le temps au Pas de Peluches, des Choses montre.) Cela dit, la plupart du temps, vous n'avez pas besoin de créer un ClassLoader personnalisé--si vous voulez futz avec bytecode sur le chemin, java.lang.l'instrument est votre ami. Si vous voulez charger un code à partir d'une URL, découvrez java.net.URLClassLoader. Entre les deux, la nécessité d'un ClassLoader personnalisé est entièrement nul.
OriginalL'auteur Ted Neward