IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

petite surprise sur l'introspection


Sujet :

Langage Java

  1. #1
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut petite surprise sur l'introspection
    bonjour
    juste une petite note.
    j'utilise java.lang.reflect pour inspecter le contenu d'un objet et j'obtiens alors un Object lorsque je lis un champ.
    mais là j'ai eu une surprise: si un champ est d'un type primitif mon code qui testait si le champ était Serializable ne marchait pas.
    effectivement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class TestSerial {
     
        public static void isItSerial(Class clazz) {
            if(Serializable.class.isAssignableFrom(clazz)) {
                System.out.println(clazz + " Is Serializable");
            } else {
                System.out.println(clazz + " Is Not serializable");
            }
        }
     
        public static void main(String[] args) {
            isItSerial(Integer.TYPE);
            isItSerial(Double.TYPE);
            isItSerial(Double.class);
        }
    }
    donc il faut que je rajoute un test pour savoir si le champ est d'un type primitif.
    bon
    question: quelle est la raison de ce comportement? il doit y avoir une bonne raison .... (par exemple: je suis serializable mais je ne suis pas un objet ... bon d'accord)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est normal les types primitifs ne sont pas des objets, et ils ne peuvent donc pas implémenté l'interface Serializable... même s'ils sont bien sérializable !!!


    De toute manière dès que tu fais de l'introspection tu te retrouves à faire plein de cas particulier pour les types primitives...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void isItSerial(Class clazz) {
            if(clazz.isPrimitive() || Serializable.class.isAssignableFrom(clazz)) {
                System.out.println(clazz + " Is Serializable");
            } else {
                System.out.println(clazz + " Is Not serializable");
            }
        }
    a++

  3. #3
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    ben oui ...
    mais ce qui m'a trompé c'est que la même donnée passait très gentiment pour un Serializable!
    exemple reconstitué differemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     Field field = TestSerial.class.getDeclaredField("val") ;
            TestSerial aSerial = new TestSerial() ;
                System.out.println(field.getType()); //int
            Object obj = field.get(aSerial) ;
                System.out.println(obj.getClass()); //Integer
            Serializable serializable = (Serializable) obj;
    et ça passe comme une lettre à la poste puisque l'affectation vers Object fait quelque chose derrière notre dos (ce qui était initialement exclu dans les "raisons d'être" de java puis est apparu quand l'encapsulation automatique a été introduite -en fait dans mon cas c'était encore plus subtil et moins facile à voir-)
    Donc ça m'a trompé gentiment!
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    et ça passe comme une lettre à la poste puisque l'affectation vers Object fait quelque chose derrière notre dos (ce qui était initialement exclu dans les "raisons d'être" de java puis est apparu quand l'encapsulation automatique a été introduite -en fait dans mon cas c'était encore plus subtil et moins facile à voir-)
    Ce n'est pas dû à l'encapsulation automatique.
    L'API de reflection a toujours utilisé des Objets "wrapper" pour les types primitifs, et ce même avant Java 5.0


    Et franchement dès que tu fais des trucs un peu poussé c'est vite galère car tu dois gérer des cas particulier un peu partout !


    a++

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  2. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  3. [Kylix] Petit Récapitulatif sur Kylix3
    Par PtitD@v dans le forum EDI
    Réponses: 1
    Dernier message: 24/02/2004, 14h46
  4. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo