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

Java Discussion :

[Javassist] Modifier une classe


Sujet :

Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [Javassist] Modifier une classe
    Bonjour,

    Je souhaite modifier pendant l'exécution une de mes classes, c'est à dire, en ajoutant un champ avec ses getter et setter.
    Donc voici ce que j'essaie de faire:
    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
    18
    19
     
    import javassist.CtClass;
    import javassist.CtField;
    import javassist.CtMethod;
    import javassist.Modifier;
     
    CtClass ctClass ;
    CtClass type = ClassPool.getDefault().get("java/lang/String");
    // Adding the field: String field;
    CtField field = new CtField(type, "field", ctClass);
    field.setModifiers(Modifier.PRIVATE);
    ctClass.addField(field);
    // Adding the setter and the getter
    CtMethod getter = new CtMethod(type, "getField", null, ctClass);
    getter.setModifiers(Modifier.PUBLIC);
    ctClass.addMethod(getter);
    CtMethod setter = new CtMethod(CtClass.voidType, "setFieldh", new CtClass[] {type}, ctClass);
    setter.setModifiers(Modifier.PUBLIC);
    ctClass.addMethod(setter);
    Pendant l'exécution, ma classe est bien modifiée mais lorsqu'elle est instanciée, j'ai l'exception suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception in thread "main" java.lang.ClassFormatError: 
    Absent Code attribute in method that is not native or abstract in class file com/project/MyClass
    J'ai l'impression qu'il faut que j'ajoute des "attibutes" aux méthodes que j'ai ajoutées mais je ne sais pas utiliser la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CtMethod.setAttribute(String name, byte[] data)
    Merci d'avance de vos réponses.

    Cordialement.

  2. #2
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Je sais pas si c'est une bonne idée de modifier une Classe de base de Java...

    Cependant, pour les getter/setter, j'utiliserai plutôt les méthodes statiques getter/setter de CtNewMethod:

    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
    CtClass classToEdit = ClassPool.getDefault().get("<mettre ici le nom de la classe à éditer>");
     
    CtClass classType = ClassPool.getDefault().get("<mettre ici le type de l'attribut>");
     
    CtField newField = new CtField(classType, "<mettre ici le nom de l'attribut>", classToEdit);
    newField.setModifiers(Modifier.PRIVATE);
    classToEdit.addField(newField);
     
    /** ajout d'un getter dans la nouvelle classe */
    CtMethod getter = CtNewMethod.getter("get"+"<mettre ici le nom de l'attribut>", newField);
    classToEdit.addMethod(getter);
     
    /** ajout d'un setter dans la nouvelle classe */
    CtMethod setter = CtNewMethod.setter("set"+"<mettre ici le nom de l'attribut>", newField);
    classToEdit.addMethod(setter);

    Si ca peut aider

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse.
    Mais je n'essaie pas de modifier un classe de base de Java... juste la classe que j'ai chargée dans la variable ctClass.
    Mais je vais essayer ce que tu viens de me dire

    Edit: Ca marche merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier une classe LaTeX
    Par Ca-Nul-Art dans le forum Débuter
    Réponses: 14
    Dernier message: 08/08/2013, 20h15
  2. Eclipse Indigo, plus moyen de modifier une classe
    Par peofofo dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/10/2011, 14h28
  3. Modifier une classe via Jquery
    Par Fooshi dans le forum jQuery
    Réponses: 10
    Dernier message: 08/06/2011, 11h31
  4. Modifier une classe par une autre classe
    Par Couz02 dans le forum C++
    Réponses: 15
    Dernier message: 05/05/2008, 10h54
  5. [CSS] modifier une classe à la volée, est-ce possible ?
    Par guidav dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/01/2007, 15h18

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