réflexion
Réflexion: mappez les propriétés et les méthodes d'une classe en classes correspondantes.
Utilisation de base de la réflexion
Il y a trois façons d'obtenir des cours de classe:
Écrivez simplement selon l'API, le processus général est:
Utilisez le type de paramètre de la méthode pour identifier de manière unique une méthode, basée sur: surcharge de méthode
Reflet des tableaux
L'exemple suivant illustre principalement plusieurs points:
classe publique RefleftTest {public static void main (String [] args) {int [] a1 = new int [] {1,2,3}; int [] a2 = new int [5]; int [] [] a3 = new int [2] [3]; System.out.println (a1.getclass () == a2.getClass ()); // true system.out.println (a1.getclass ()); // class [i system.out.println (a1.getclass (). A3.GiltClass (). GetSuperClass ()); // true System.out.println (a2.getClass (). GetSuperclass ()); // class java.lang.object // La phrase suivante ne compile pas: erreur: (15, 42) Java: Types non associés: java.lang.class <capture # 1, Total? étend int []> et java.lang.class <capture # 2, total? étend int [] []> //System.out.println (a1.getClass () == a3.getClass ()); Objet [] b3 = a3; // compilé par // La phrase suivante ne passe pas d'erreur: (17, 24) java: type incompatible: int [] ne peut pas être converti en java.lang.object [] // objet [] b1 = a1; String S1 = "ABC"; System.out.println (arrays.aslist (a1)); // [[i @ 1540e19d] System.out.println (arrays.aslist (s1)); // [ABC]}}Sortir:
trueclass [iclass [[iTrueclass java.lang.object [[i @ 1540e19d] [ABC]
Entrée: HashCode et Problème de fuite de mémoire Reportez-vous à l'API Java:
Si la variable membre participant au calcul de Hascode change au milieu, la suppression suivante échoue, entraînant des fuites de mémoire
Chargement du fichier de configuration
Le chargeur de classe charge le fichier de configuration en lecture seule Nom.class.getClassloader (). GetResourCeasStream (STR);
La classe name.class.getResourceSstream (STR), appelle essentiellement le chargeur de classe. Code source Intercept (class.java sous le package java.lang):
public inputStream getResourCeAsStream (String Name) {name = résolveName (name); Classloadher cl = getClassLoader0 (); if (cl == null) {// une classe système. return classloader.getSystemResourCeasStream (name); } return cl.getResourceSstream (nom);}En ce qui concerne le chemin STR, la méthode d'écriture est un peu particulière.
Dans le passé, lors de la compilation du code Java, certains dossiers ont dû être ajoutés aux dépendances ou marqués en dossiers source. C'étaient évidemment des fichiers XML, mais il n'y avait pas de code source Java. De là, je sais maintenant que c'est à cause de l'utilisation de la réflexion pour charger le fichier de configuration
Inspecteur et javabean
Le processus de lecture de Javabean la valeur de l'attribut x: capitalisation, préfixe et méthodes d'obtention.
"x" -> "x" -> "getx" -> "méthodygetx"
Je ne l'ai pas utilisé pour le faire fonctionner moi-même avec l'introspection pour le moment, donc je ne collerai plus le code, seule la classe de base est attachée
Implémentation simple: utilisez la classe java.beans.propertydescriptor
Implémentation de problème: utilisez la classe java.beans.introspector pour traverser la valeur de retour de la méthode GetBeaninfo
Javabean doit avoir un constructeur sans paramètres
Utilisation de la boîte à outils Beanutils