SlideShare a Scribd company logo
1 of 19
I NTROSPECTION / R EFLECTION
EN J AVA
             www.abyster.com

                1
2                                   M OTIVATIONS

       Besoin de:
           Déterminer une caractéristique d'un objet de façon
            dynamique,
           Pouvoir agir de façon générique sur un objet,
       Pour cela, il est nécessaire de :
           Disposer d'informations 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                             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
        C ONSÉQUENCES AU NIVEAU
                 DE L ' EXÉCUTION


       Le premier domaine d'application est l'exé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                 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
                C AS D ’ UTILISATIONS DE
                     L’API REFLECTION

       Introspection = découverte des caractéristiques d'une
        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 d'un générateur de code générique pour un
        ensemble de classe.
       Processus de sérialisation d'un bean Java ou dans la
        génération du code de création d'un table en base de
        données pour la persistance de la classe cible.
       Pour tout outil devant faire abstraction des spécificités
        d'une application en proposant un service générique
        pour n'importe quelle classe.
PAQUETAGE JAVA . LANG . REFLECT: L A
7
                               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();
               }
         }
PAQUETAGE JAVA . LANG . REFLECT: L ES
8
          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(),
PAQUETAGE JAVA . LANG . REFLECT: L A
9
                                CLASSE F IELD




        Contient les informations sur un champ,

        Quelques méthodes:
            String getName()

            Class getType()

            int getModifier()
PAQUETAGE JAVA . LANG . REFLECT: L A
10
                            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)
PAQUETAGE JAVA . LANG . REFLECT: L A
11
                             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é,
PAQUETAGE JAVA . LANG . REFLECT: L A
12
                      CLASSE C ONSTRUCTOR




         Contient les informations sur un constructeur,

         Quelques méthodes:
             Class[] getExceptionTypes()

             String getName()

             Class[] getParameterTypes()

             int getModifiers()
U TILISATION    DE LA RÉFLEXIVITÉ :      E DITION
13                    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));
     }
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
          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
            A U DELÀ DES RÈGLES DE
                   L ' ENCAPSULATION


        Ce que permet de faire l'API Reflection dépasse
         largement le cadre de l'encapsulation,

        Jusqu'à présent nous avons consulté et agi sur
         des champs et méthodes publiques,

        Cette API permet d'inspecter tous les éléments
         d'une classe, quelle que soit sa visibilité
A U DELÀ DES RÈGLES DE
17
         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
              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);
         }
AU     DELÀ DES RÈGLES DE
19
         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 d'appeler la
             méthode setAccessible en définissant
             un SecurityManager.

            Dépasse le cadre de la présentation,

            Consulter le paquetage java.security,

More Related Content

What's hot

Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateursAziz Darouichi
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux javaInes Ouaz
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objetsAbdoulaye Dieng
 
c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)Mahfoud EL HOUDAIGUI
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetkemenaran
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage PythonAziz Darouichi
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Aziz Darouichi
 
Java chap 04 surcharge des méthodes [mode de compatibilité]
Java chap 04 surcharge des méthodes [mode de compatibilité]Java chap 04 surcharge des méthodes [mode de compatibilité]
Java chap 04 surcharge des méthodes [mode de compatibilité]Yassine Badri
 
Chap 03 poo en java partie2
Chap 03 poo en java partie2Chap 03 poo en java partie2
Chap 03 poo en java partie2Yassine Badri
 
Interface collectionsinter
Interface collectionsinterInterface collectionsinter
Interface collectionsinterRYMAA
 

What's hot (19)

Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux java
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objets
 
Csharp2014
Csharp2014Csharp2014
Csharp2014
 
c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Ch09
Ch09Ch09
Ch09
 
Part1
Part1Part1
Part1
 
Langage C#
Langage C#Langage C#
Langage C#
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objet
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
 
Java chap 04 surcharge des méthodes [mode de compatibilité]
Java chap 04 surcharge des méthodes [mode de compatibilité]Java chap 04 surcharge des méthodes [mode de compatibilité]
Java chap 04 surcharge des méthodes [mode de compatibilité]
 
Chap 03 poo en java partie2
Chap 03 poo en java partie2Chap 03 poo en java partie2
Chap 03 poo en java partie2
 
Interface collectionsinter
Interface collectionsinterInterface collectionsinter
Interface collectionsinter
 
Memo java
Memo javaMemo java
Memo java
 

Viewers also liked

Viewers also liked (20)

5-Cm12 développer-factoriser-14-15
5-Cm12 développer-factoriser-14-155-Cm12 développer-factoriser-14-15
5-Cm12 développer-factoriser-14-15
 
20131014 2 factory-support de prçsentation p+w #3 -v.02 Etude Print+web 2013.
20131014 2 factory-support de prçsentation p+w  #3 -v.02 Etude Print+web 2013. 20131014 2 factory-support de prçsentation p+w  #3 -v.02 Etude Print+web 2013.
20131014 2 factory-support de prçsentation p+w #3 -v.02 Etude Print+web 2013.
 
Samih Abid Orange Mobility Forum Mai 2012
Samih Abid Orange Mobility Forum Mai 2012Samih Abid Orange Mobility Forum Mai 2012
Samih Abid Orange Mobility Forum Mai 2012
 
3-Cm22 2013-2014
3-Cm22 2013-20143-Cm22 2013-2014
3-Cm22 2013-2014
 
Pau lanta - #ET9
Pau lanta - #ET9Pau lanta - #ET9
Pau lanta - #ET9
 
6-Cm12 15-16
6-Cm12 15-166-Cm12 15-16
6-Cm12 15-16
 
Présentation- A la découverte de l'Est et de sa diversité
Présentation- A la découverte de l'Est et de sa diversitéPrésentation- A la découverte de l'Est et de sa diversité
Présentation- A la découverte de l'Est et de sa diversité
 
3-Cm3 2013-2014
3-Cm3 2013-20143-Cm3 2013-2014
3-Cm3 2013-2014
 
5-Cm13 pourcentage
5-Cm13 pourcentage5-Cm13 pourcentage
5-Cm13 pourcentage
 
Cp lamoureux 130413
Cp lamoureux 130413Cp lamoureux 130413
Cp lamoureux 130413
 
Dp 170514
Dp 170514Dp 170514
Dp 170514
 
Trafic passagers-route-france-italie-sans-peage-2011-2012
Trafic passagers-route-france-italie-sans-peage-2011-2012Trafic passagers-route-france-italie-sans-peage-2011-2012
Trafic passagers-route-france-italie-sans-peage-2011-2012
 
5-Cm13 15-16
5-Cm13 15-165-Cm13 15-16
5-Cm13 15-16
 
Save you capital gain taxes
Save you capital gain taxesSave you capital gain taxes
Save you capital gain taxes
 
Heraclitus fragments 1 (2)
Heraclitus   fragments 1 (2)Heraclitus   fragments 1 (2)
Heraclitus fragments 1 (2)
 
Les catherinettes à mérida
Les catherinettes à méridaLes catherinettes à mérida
Les catherinettes à mérida
 
4-Cm1 15-16
4-Cm1 15-164-Cm1 15-16
4-Cm1 15-16
 
Les alpes suisses
Les alpes suissesLes alpes suisses
Les alpes suisses
 
Cp 260114
Cp 260114Cp 260114
Cp 260114
 
Keratites des carnivores
Keratites des carnivoresKeratites des carnivores
Keratites des carnivores
 

Similar to Introspection reflection

Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objetAmir Souissi
 
Langage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetLangage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetMohammed Jaafar
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scalaSOAT
 
Introduction java
Introduction javaIntroduction java
Introduction javaFouad Root
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
chapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfMoez Moezm
 
JAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAJAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAAymen Bedwivski
 
Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaAmel Morchdi
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Jean-Michel Doudoux
 

Similar to Introspection reflection (20)

22-reflection.pdf
22-reflection.pdf22-reflection.pdf
22-reflection.pdf
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Cours java
Cours javaCours java
Cours java
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
Chapitre3 2013 POO
Chapitre3 2013 POOChapitre3 2013 POO
Chapitre3 2013 POO
 
Langage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetLangage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté Objet
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
 
Cours de JAVA de base
Cours de JAVA  de baseCours de JAVA  de base
Cours de JAVA de base
 
Introduction java
Introduction javaIntroduction java
Introduction java
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
XB-Java.ppt
XB-Java.pptXB-Java.ppt
XB-Java.ppt
 
chapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdf
 
JAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAJAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVA
 
Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 java
 
Java
JavaJava
Java
 
Jdbc
JdbcJdbc
Jdbc
 
expression lambda
expression lambdaexpression lambda
expression lambda
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
 

More from Eric Toguem

Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promessesEric Toguem
 
Linked open data pour la consommation des informations
Linked open data pour la consommation des informationsLinked open data pour la consommation des informations
Linked open data pour la consommation des informationsEric Toguem
 
Plateformes de développement d’applications mobiles
Plateformes de développement d’applications mobilesPlateformes de développement d’applications mobiles
Plateformes de développement d’applications mobilesEric Toguem
 
Développement d’applications ussd en java
Développement d’applications ussd en javaDéveloppement d’applications ussd en java
Développement d’applications ussd en javaEric Toguem
 
Les expressions régulières en java
Les expressions régulières en javaLes expressions régulières en java
Les expressions régulières en javaEric Toguem
 

More from Eric Toguem (6)

Design patterns
Design patternsDesign patterns
Design patterns
 
Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promesses
 
Linked open data pour la consommation des informations
Linked open data pour la consommation des informationsLinked open data pour la consommation des informations
Linked open data pour la consommation des informations
 
Plateformes de développement d’applications mobiles
Plateformes de développement d’applications mobilesPlateformes de développement d’applications mobiles
Plateformes de développement d’applications mobiles
 
Développement d’applications ussd en java
Développement d’applications ussd en javaDéveloppement d’applications ussd en java
Développement d’applications ussd en java
 
Les expressions régulières en java
Les expressions régulières en javaLes expressions régulières en java
Les expressions régulières en java
 

Introspection reflection

  • 1. I NTROSPECTION / R EFLECTION EN J AVA www.abyster.com 1
  • 2. 2 M OTIVATIONS  Besoin de:  Déterminer une caractéristique d'un objet de façon dynamique,  Pouvoir agir de façon générique sur un objet,  Pour cela, il est nécessaire de :  Disposer d'informations 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 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 C ONSÉQUENCES AU NIVEAU DE L ' EXÉCUTION  Le premier domaine d'application est l'exé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 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 C AS D ’ UTILISATIONS DE L’API REFLECTION  Introspection = découverte des caractéristiques d'une 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 d'un générateur de code générique pour un ensemble de classe.  Processus de sérialisation d'un bean Java ou dans la génération du code de création d'un table en base de données pour la persistance de la classe cible.  Pour tout outil devant faire abstraction des spécificités d'une application en proposant un service générique pour n'importe quelle classe.
  • 7. PAQUETAGE JAVA . LANG . REFLECT: L A 7 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. PAQUETAGE JAVA . LANG . REFLECT: L ES 8 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. PAQUETAGE JAVA . LANG . REFLECT: L A 9 CLASSE F IELD  Contient les informations sur un champ,  Quelques méthodes:  String getName()  Class getType()  int getModifier()
  • 10. PAQUETAGE JAVA . LANG . REFLECT: L A 10 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. PAQUETAGE JAVA . LANG . REFLECT: L A 11 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. PAQUETAGE JAVA . LANG . REFLECT: L A 12 CLASSE C ONSTRUCTOR  Contient les informations sur un constructeur,  Quelques méthodes:  Class[] getExceptionTypes()  String getName()  Class[] getParameterTypes()  int getModifiers()
  • 13. U TILISATION DE LA RÉFLEXIVITÉ : E DITION 13 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. 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 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 A U DELÀ DES RÈGLES DE L ' ENCAPSULATION  Ce que permet de faire l'API Reflection dépasse largement le cadre de l'encapsulation,  Jusqu'à présent nous avons consulté et agi sur des champs et méthodes publiques,  Cette API permet d'inspecter tous les éléments d'une classe, quelle que soit sa visibilité
  • 17. A U DELÀ DES RÈGLES DE 17 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 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. AU DELÀ DES RÈGLES DE 19 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 d'appeler la méthode setAccessible en définissant un SecurityManager.  Dépasse le cadre de la présentation,  Consulter le paquetage java.security,