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 :

évaluer une string en classe !


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 42
    Points : 25
    Points
    25
    Par défaut évaluer une string en classe !
    bonjour,
    je cherche à évaluer une string pour avoir une référence sur une classe, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (composant+"EditPart").VISUAL_ID
    ou composant est une string, et je cherche donc à pointer ma classe formée par cette string pour obtenir une constante visual_id !

    j'ai fait un cast mais ça ne marche pas ou je m'y prend mal !

    merci

  2. #2
    Membre habitué Avatar de Tazmanian Devil
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 149
    Points
    149
    Par défaut
    C'est pas si simple parceque tu dois connaitre le package complet de la classe, fouille vers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName("mon.pakage."+composant+"EditPart").getField("VISUAL_ID").get(null)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    je regarde ça de suite !
    merci beaucoup .... je commencais à m'énerver !

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Oulà, cela ressemble à une énorme erreur de conception... Déjà quand c'est pour récupérer une méthode la plupart du temps c'est faux, mais là un attribut !

    À part si c'est vraiment pour faire de l'introspection, il ne faut pas faire ça

    Dans quel contexte as-tu besoin de faire ça?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    ouias, là il faudrait plutot une interface
    implementée par toutes tes classes (composant+"EditPart") avec comme attribut VISUAL_ID

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Effectivement, il y a de bonnes chances qu'il y ait des soucis de conception ... Mais l'interface, c'est pas gagné pour définir plusieurs constantes ^^

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    je me doute que c'est pas propre ! alors voila mon probléme !

    je me sers de jet, qui est un générateur de code pour générer du code xmi !

    ce code xmi est interprêté par la suite et me donne un éditeur graphique avec des formes, défini dans le code xmi !!! voici un aperçu :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <%@ jet package="generation" imports="java.util.* generation.Generate java.io.IOException" class="generateControle" %>
    <%paramTemplate obj=(paramTemplate)argument;%> 
    <%List tab=(List)obj.getTab();%> 
    <%String url=(String)obj.getUrl();%> 
    <%String descId=(String)obj.getDescripteurId();%> 
    <%List savID=new ArrayList();%>
    <%List savIDatt=new ArrayList();%>
    <%List savIDprt=new ArrayList();%>
    <%List savIDprtAsyn=new ArrayList();%>
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xmi:XMI xmlns:xmi="http://www.omg.org/XMI" xmlns:Descripteur="http:///Descripteur.ecore" xmlns:DescripteurControle="http:///DescripteurControle.ecore" xmlns:Rdpo="http:///Rdpo.ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.0/notation" xmi:version="2.0">
    <modele>
    <contientComposantControle xmi:type="Descripteur:composantControle" xmi:id="<%try {savID.add(Generate.getID("composantControle"));%><%=savID.get(savID.size()-1)%><%} catch (IOException e) {e.printStackTrace();}%>">  
    <%for (ListIterator it = tab.listIterator(); it.hasNext();) {
    String str= (String)(it.next());		
    if (str.equals("Attribut")){%>
    	<refAttribut xmi:type="Descripteur:AttributValue" xmi:id="<%try {savIDatt.add(Generate.getID("AttributValue"));%><%=savIDatt.get(savIDatt.size()-1)%><%} catch (IOException e) {e.printStackTrace();}%>" nomAttributValue="nom"/>
    	<%}else if(str.equals("DescripteurPortControle")){%>
    	<redefinePort_controle xmi:type="Controle:PortControle" xmi:id="<%try {savIDprt.add(Generate.getID("PortControle"));%><%=savIDprt.get(savIDprt.size()-1)%><%} catch (IOException e) {e.printStackTrace();}%>" nomPort="nom">
    		<%while((it.hasNext()) && it.next().equals("DescripteurPortAsynchrone")){%>							
    			<redefineContenuPortControle xmi:type="Controle:PortAsynchrone" xmi:id="<%try {savIDprtAsyn.add(Generate.getID("PortAsynchrone"));%><%=savIDprtAsyn.get(savIDprt.size()-1)%><%} catch (IOException e) {e.printStackTrace();}%>" nomPort="nom"/>
    		<%}%>
    		<%it.previous();%>
    	</redefinePort_controle>	
    	<%}%>
    <%}%>
    <instance xmi:type="Descripteur:descripteurControle" href="<%=url%>#<%=descId%>"/>
    </contientComposantControle>
    </modele>
    <%Iterator iter =  savID.iterator();%>
    <%Iterator iterAtt =  savIDatt.iterator();%>
    <%Iterator iterPrt =  savIDprt.iterator();%>
    <%Iterator iterPrtAsyn =  savIDprtAsyn.iterator();%>
     
    <diagram>
    le code jet peut être vu comme un squelette ou une maquette, le code jet créer une classe java qui édite un buffer, à partir de la création d'un doc dom, je créer un fichier qui s'ouvre avec un éditeur graphique spécifique gmf !
    voila dans mon squelette, j'appel des méthodes qui me renvoi des choses ! la il y en a plusieurs, entre autre la c'est une constante d'une classe !!!
    or cette classe en question est générer à partir de modéle ecore ! et à chaque fois que je modifie mon modéle, les identifiants changent !!!! donc dans mon squelette, je dois faire appel à un service, qui est une méthode static, et celle-ci me renvoi, l'id en appellant MaClass.ID !! je passe en paramètre une string. cette string en concaténant "EditPart" donne une classe exitante !!!! il suffit que j'évalue cette string pour pointer ma classe ! et obtenir mon id !!!
    pour quelles raisons c'est pas propre ? y a-t- il une autre solution ?
    quels livres me conseillez-vous pour apprendre à programmer correctement ?
    merci

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Euh... je retire ce que j'ai dit, ce n'est pas ton code qui n'est pas propre ...

    Vive les générateurs !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par chtig
    Effectivement, il y a de bonnes chances qu'il y ait des soucis de conception ... Mais l'interface, c'est pas gagné pour définir plusieurs constantes ^^
    effectivement avec une interface ça va pas le faire, mais si la constante en quesiton est censée changer suivant le contexte c'est que c'est pas une constante

    Donc c'est un attribut de classe avec le getter qui va bien, et en l'occurence si tu veux que tous tes objets aient cette attribut et bien il faut une interface, ou bien un héritage

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    c'est une constante !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class ComposantRepresentationEditPart extends ShapeNodeEditPart {
     
    	/**
             * @generated
             */
    	public static final int VISUAL_ID = 1001;
    avec static et final ! y a pas de doute !! c'est une constante !
    mais elle change quand on regénère le code suite à une modification du modéle !!! on est pas censé faire de génération une fois le modèle complet et validé (dans mon cas en tout cas) mais effectivement il est possible de modifier à la volée les ecore !
    donc on peut faire autrement ????!!!!!

    y a des livres pour mieux programmer ??? j'ai un livre d'algorithmie : les bases qui disent qui doit faire 1500 pages !!!! au bas mots !!!! c'est un probléme d'algorithme la ou de conception ??? et toujours la même question quel livre ??
    ça doit pas être dur la conception !! encapsulage,héritage, déterminisme
    on a toutes les notions la !!!??? non ???

  11. #11
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Citation Envoyé par mirak63
    Donc c'est un attribut de classe avec le getter qui va bien, et en l'occurence si tu veux que tous tes objets aient cette attribut et bien il faut une interface, ou bien un héritage
    Un peu hors sujet, mais je réagis juste sur le fait qu'il ne faut pas confondre attribut de classe et attribut d'instance !!!

    Et effectivement, ici il s'agit bien d'une constante, donc d'un attribut de classe static et chaque classe a son attribut (tous ont le même nom).
    Pour ça que j'ai enlevé ma remarque qui disait que c'était certainement mal conçu, car ça vient du générateur et non du développement ...

  12. #12
    Membre habitué Avatar de Tazmanian Devil
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 149
    Points
    149
    Par défaut
    Pour ma part, je part du principe qu'il n'y a pas de mauvaise solution à partir du moment ou on en a trouvé qu'une (si elle est unique c'est qu'elle est propre)

    Donc discuter sur la conception, surtout dans le cas présent, ne sert pas à grand chose, ceux qui ont essayé les transformations jet2, ecore et autres MDD/MDA comme bnuitrare n'etant pas légion (on s'éloigne du développement pur et dur) sont contraint de composer avec les capacités et restrictions fournis par les outils.

    je persiste avec le Class.forName si ca repond à ton besoin

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    voui ça marche !
    faut juste que je parcours en plus mes différents package avec un for ! pour trouver ma classe ! ou sinon j'envoi le chemin complet
    mais ceci marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return Class.forName("controle.diagram.edit.parts."+compo+"EditPart").getField("VISUAL_ID").get(null).toString();
    je mettrais résolu d'ici la fin d'aprem pour avoir d'autre avis !
    merci taz !

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

Discussions similaires

  1. évaluer une string en nombre
    Par robert_trudel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2009, 20h53
  2. Réponses: 9
    Dernier message: 25/06/2008, 16h48
  3. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  4. Réponses: 3
    Dernier message: 02/09/2007, 21h16
  5. Encoder une String en HTML dans une classe
    Par joKED dans le forum ASP.NET
    Réponses: 1
    Dernier message: 24/07/2007, 16h33

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