Démo ClassReflection
Copiez le code comme suit :
paquet Réflexion ;
@Obsolète
classe publique ReflectionDemo {
chaîne privée pri_field ;
chaîne publique champ_pub ;
public ReflectionDemo(){}
public ReflectionDemo (nom de la chaîne) {}
private ReflectionDemo (Nom de la chaîne, int int1) {}
public void ReflectMethod(){}
public void ReflectMethod(String str){}
privé vide ReflectMethod (int int1) {}
classe innerclss_Refection{}
}
Classe de testReflectionDemoTest
Copiez le code comme suit :
paquet Réflexion ;
importer java.lang.annotation.Annotation ;
importer java.lang.reflect.Constructor ;
importer java.lang.reflect.Field ;
importer java.lang.reflect.Method ;
classe publique ReflectionDemoTest {
public static void main (String[] arguments) {
//Créez un objet de classe et utilisez une modification générique pour éviter un transfert forcé
Classe cla=ReflectionDemo.class;
//Méthode pour obtenir tous les champs publics
Field[] field=cla.getFields();
pour(Champ f:champ){
System.out.println("Méthode pour obtenir tous les champs publics :"+f.toString());
}
//Méthode pour obtenir un domaine public spécifié
essayer {
Champ field1=cla.getField("pub_field");
System.out.println("Méthode pour obtenir le champ public spécifié :"+field1.toString());
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Méthode pour obtenir tous les domaines (y compris les domaines privés), Déclarer
Field[] field2=cla.getDeclaredFields();
pour(Champ f:champ2){
System.out.println("Méthode pour obtenir tous les champs (y compris les champs privés) :"+f.toString());
}
//Méthode pour obtenir le domaine spécifié (y compris le domaine privé)
essayer {
Champ field3=cla.getDeclaredField("pri_field");
System.out.println("Méthode pour obtenir le champ spécifié (y compris le champ privé) :"+field3.toString());
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Obtenir toutes les méthodes publiques (y compris les classes parentes)
Method[] method=cla.getMethods();
pour(Méthode m:méthode){
System.out.println("Obtenir toutes les méthodes publiques :"+m.toString());
}
essayer {
//Obtenir la méthode sans paramètre spécifiée
//Le deuxième paramètre indique le type de paramètre et le paramètre NUll indique la méthode sans paramètre.
Méthode method1=cla.getMethod("ReflectMethod", null);
System.out.println("Obtenir la méthode de la méthode publique sans paramètres :"+method1.toString());
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Méthode pour obtenir toutes les méthodes de cette classe (hors classe parent)
Method[] method2=cla.getDeclaredMethods();
pour(Méthode m:méthode2){
System.out.println("Obtenir toutes les méthodes (y compris les classes parentes) :"+m.toString());
}
//Obtenir la méthode de la méthode spécifiée de cette classe (hors classe parent)
//Le premier paramètre est le nom de la méthode, le deuxième paramètre est le type de retour de la méthode et NULL est la méthode sans paramètres.
essayer {
Méthode method3=cla.getDeclaredMethod("ReflectMethod",int.class);
System.out.println("Obtenir la méthode de la méthode spécifiée de cette classe (à l'exclusion de la classe parent) :"+method3);
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Obtenir le constructeur public
//Obtenir le constructeur public sans paramètres
essayer {
Constructeur cs=cla.getConstructor(null);
System.out.println("Obtenir le constructeur sans paramètre :"+cs);
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Obtenir le constructeur public avec les paramètres
// S'il existe un constructeur avec plusieurs paramètres, il existe plusieurs constructeurs. Faites attention à l'ordre.
essayer {
Constructeur cs=cla.getConstructor(String.class);
System.out.println("Obtenir le constructeur paramétré :"+cs);
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Obtenir toutes les méthodes de construction
essayer {
Constructeur[] cs=cla.getDeclaredConstructors();
pour (Constructeur c:cs){
System.out.println("Obtenir toutes les méthodes de construction :"+c);
}
} catch (SecurityException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
//Obtenir le nom du package
Package pack=cla.getPackage();
System.out.println("Obtenir le nom du package actuel :"+pack);
//Obtenir des commentaires
Annotation[] ann=cla.getAnnotations();
pour(Annotation an:ann){
System.out.println(an.toString());
}
//Récupère la classe parent
Classe supercla=cla.getSuperclass();
System.out.println(supercla);
//Obtenir la classe interne
Class[] innercla=cla.getDeclaredClasses();
pour (Classe cl:innercla){
System.out.println(cl);
}
}
}
Résumé : étapes pour obtenir des informations sur les objets de classe :
1. Créez un objet Class. Méthode 1 Classe cla=Class.forName(“PATH”) Méthode 2 CLass cla=Instance.getclass();
2. Utilisez Field, Method, Constructor, Package et Annotation pour obtenir des informations pertinentes en appelant la méthode cla.getXXXX.
3. Les méthodes d'obtention des classes parentes et des classes internes sont légèrement différentes.
4. Lors de l'utilisation de cla.getMethods, toutes les méthodes publiques de la classe et de la classe parent sont appelées.
5. Lors de l'utilisation de Declared, toutes les méthodes de la classe, y compris les méthodes privées, sont appelées. Il en va de même pour les domaines et les constructeurs.
6. Lorsque la classe de réflexion n'a pas de constructeur public et ne peut pas utiliser directement la méthode newInstance, utilisez
Méthode cs=cla.getMethod("getInstance",null);//Obtenir la méthode
Calendar Calendar=(Calendar) cs.invoke(cla, null);//Exécuter la méthode obtenue, le paramètre 1 est l'objet de la méthode d'exécution, le paramètre 2 représente les paramètres de la méthode
Date df=calendar.getTime();
System.out.println(df.toString());
obtenir.