I NTROSPECTION / R EFLECTIONEN J AVA             www.abyster.com                1
2                                   M OTIVATIONS       Besoin de:           Déterminer une caractéristique dun objet de ...
3                             LE      BYTE CODE       Ne se limite pas à de simples instructions exécutables.       Cont...
4        C ONSÉQUENCES AU NIVEAU                 DE L  EXÉCUTION       Le premier domaine dapplication est lexécution,   ...
5                 L UTILITAIRE                JAVAP       Décompilateur élémentaire.           Classe parente,         ...
6                C AS D ’ UTILISATIONS DE                     L’API REFLECTION       Introspection = découverte des carac...
PAQUETAGE JAVA . LANG . REFLECT: L A7                               CLASSE C LASS        Les instances sont des classes o...
PAQUETAGE JAVA . LANG . REFLECT: L ES8          MÉTHODES DE LA CLASSE C LASS       java.lang.reflect.Field getField(Strin...
PAQUETAGE JAVA . LANG . REFLECT: L A9                                CLASSE F IELD        Contient les informations sur u...
PAQUETAGE JAVA . LANG . REFLECT: L A10                            CLASSE M ODIFIER         Permet d’interpréter le modifi...
PAQUETAGE JAVA . LANG . REFLECT: L A11                             CLASSE M ETHOD         Contient les informations sur u...
PAQUETAGE JAVA . LANG . REFLECT: L A12                      CLASSE C ONSTRUCTOR         Contient les informations sur un ...
U TILISATION    DE LA RÉFLEXIVITÉ :      E DITION13                    ET CONSULTATION D  UN CHAMP     void changeValeur(O...
U TILISATION              DE LA RÉFLEXIVITÉ :14                                   INVOCATION D ’ UNE MÉTHODE     Object la...
15          E XERCICE : I NSPECTEUR DE                                    CLASSE SIMPLE        Ecrire un inspecteur de cl...
16            A U DELÀ DES RÈGLES DE                   L  ENCAPSULATION        Ce que permet de faire lAPI Reflection dép...
A U DELÀ DES RÈGLES DE17         L  ENCAPSULATION : TRANSGRESSIONS        Transgression 1 : visibilité d’un membre invisi...
18              A U DELÀ DES RÈGLES DE         L  ENCAPSULATION : EXEMPLE        Soit une classe Secret avec un champ    ...
AU     DELÀ DES RÈGLES DE19         L  ENCAPSULATION :              P ROTECTIONS        Il existe néanmoins des possibili...
Prochain SlideShare
Chargement dans…5
×

Introspection reflection

562 vues

Publié le

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
562
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1
Actions
Partages
0
Téléchargements
16
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Introspection reflection

  1. 1. I NTROSPECTION / R EFLECTIONEN J AVA www.abyster.com 1
  2. 2. 2 M OTIVATIONS  Besoin de:  Déterminer une caractéristique dun objet de façon dynamique,  Pouvoir agir de façon générique sur un objet,  Pour cela, il est nécessaire de :  Disposer dinformations sur les méta données des classes  Pouvoir agir sur un objet en ne connaissant pas le champs ou la méthode concernés au moment de la compilation
  3. 3. 3 LE BYTE CODE  Ne se limite pas à de simples instructions exécutables.  Contient de nombreuses informations plus proches du code source du fichier .class : les méta données  Classe parente,  Interface implémentée,  Champs,  Méthodes
  4. 4. 4 C ONSÉQUENCES AU NIVEAU DE L EXÉCUTION  Le premier domaine dapplication est lexécution,  Exemple:  Vous utilisez une bibliothèque pour écrire un petit programme que vous compilez  Une nouvelle version de la bibliothèque devient disponible. Vous remplacez le jar et relancez votre programme  Java.lang.NoSuchMethodError At MonProg.main(MonProg.java:36)
  5. 5. 5 L UTILITAIRE JAVAP  Décompilateur élémentaire.  Classe parente,  Interface implémentée,  Champs,  Méthodes  Il est présent dans le répertoire jdkbin et sa syntaxe de base est la suivante  javap monPaquetage.NomClasse
  6. 6. 6 C AS D ’ UTILISATIONS DE L’API REFLECTION  Introspection = découverte des caractéristiques dune classe (classe mère, champs, méthodes, ...),  Instancier des classes de manière dynamique, en agissant sur ses champs, en appelant ses méthodes ...  Écriture dun générateur de code générique pour un ensemble de classe.  Processus de sérialisation dun bean Java ou dans la génération du code de création dun table en base de données pour la persistance de la classe cible.  Pour tout outil devant faire abstraction des spécificités dune application en proposant un service générique pour nimporte quelle classe.
  7. 7. PAQUETAGE JAVA . LANG . REFLECT: L A7 CLASSE C LASS  Les instances sont des classes ou des interfaces,  Elle est indispensable pour pouvoir manipuler des méta données  Exemple public class Exemple { public Exemple() { } public String getNom(Object o) { Class c = o.getClass(); return c.getName(); } }
  8. 8. PAQUETAGE JAVA . LANG . REFLECT: L ES8 MÉTHODES DE LA CLASSE C LASS  java.lang.reflect.Field getField(String name),  java.lang.reflect.Field[] getFields(),  java.lang.reflect.Method getMethod(String name, Class[] parameterTypes),  java.lang.reflect.Method[] getMethods(),  java.lang.reflect.Constructor getConstructor(Class[] parameterTypes),  java.lang.reflect.Constructor[] getConstructors(),  Class[] getInterfaces(),  Class getSuperclass(),  java.lang.Package getPackage(),
  9. 9. PAQUETAGE JAVA . LANG . REFLECT: L A9 CLASSE F IELD  Contient les informations sur un champ,  Quelques méthodes:  String getName()  Class getType()  int getModifier()
  10. 10. PAQUETAGE JAVA . LANG . REFLECT: L A10 CLASSE M ODIFIER  Permet d’interpréter le modificateur renvoyé par le field,  Quelques unes de ses méthodes  boolean static isFinal(int mod)  boolean static isPublic(int mod)  boolean static isStatic(int mod)
  11. 11. PAQUETAGE JAVA . LANG . REFLECT: L A11 CLASSE M ETHOD  Contient les informations sur une méthodes,  Quelques méthodes:  Class[] getExceptionTypes()  String getName()  Class getReturnType()  Class[] getParameterTypes()  int getModifiers()  Dans le cas d’un type primitif, le wrapper est utilisé,
  12. 12. PAQUETAGE JAVA . LANG . REFLECT: L A12 CLASSE C ONSTRUCTOR  Contient les informations sur un constructeur,  Quelques méthodes:  Class[] getExceptionTypes()  String getName()  Class[] getParameterTypes()  int getModifiers()
  13. 13. U TILISATION DE LA RÉFLEXIVITÉ : E DITION13 ET CONSULTATION D UN CHAMP void changeValeur(Object o, String nomChamp, Object val) throws Exception { Field f = o.getClass().getField(nomChamp); f.set(o,val); } void afficheValeur(Object o, String nomChamp) throws Exception { Field f = o.getClass().getField(nomChamp); System.out.println(f.get(o)); }
  14. 14. U TILISATION DE LA RÉFLEXIVITÉ :14 INVOCATION D ’ UNE MÉTHODE Object lancerMethode(Object o, Object[] args, String nomMethode) throws Exception { Class[] paramTypes = null; if(args != null) { paramTypes = new Class[args.length]; for(int i=0;i<args.length;++i) { paramTypes[i] = args[i].getClass(); } } Method m = o.getClass() .getMethod(nomMethode,paramTypes); return m.invoke(o,args); }
  15. 15. 15 E XERCICE : I NSPECTEUR DE CLASSE SIMPLE  Ecrire un inspecteur de classe simple capable de:  Lister toutes les signatures des méthodes de la classe d’un objet,  Lister tous les champs de la classes d’un objet:  Déclaration du champ,  Valeur du champ,
  16. 16. 16 A U DELÀ DES RÈGLES DE L ENCAPSULATION  Ce que permet de faire lAPI Reflection dépasse largement le cadre de lencapsulation,  Jusquà présent nous avons consulté et agi sur des champs et méthodes publiques,  Cette API permet dinspecter tous les éléments dune classe, quelle que soit sa visibilité
  17. 17. A U DELÀ DES RÈGLES DE17 L ENCAPSULATION : TRANSGRESSIONS  Transgression 1 : visibilité d’un membre invisible  getDeclaredFields et getDeclaredMethods pour les membres publics, private et protected  Transgression 2: manipulation d’un membre invisible  setAccessible(boolean b) permet de faire sauter le verrou de sécurité
  18. 18. 18 A U DELÀ DES RÈGLES DE L ENCAPSULATION : EXEMPLE  Soit une classe Secret avec un champ privé priv (String). void modifierChamp(Secret s, String val) { Field f = s.getClass().getDeclaredField("priv"); f.setAccessible(true); f.set(s,val); }
  19. 19. AU DELÀ DES RÈGLES DE19 L ENCAPSULATION : P ROTECTIONS  Il existe néanmoins des possibilités pour combler ce manque de protection.  La méthode setAccessible est définie dans la classe AccessibleObject (dont dérivent les classes Field, Method et Constructor).  Définir qui possède le droit dappeler la méthode setAccessible en définissant un SecurityManager.  Dépasse le cadre de la présentation,  Consulter le paquetage java.security,

×