bonjour
Je veux créer une interface dont le noms est le résultat d'un get qui se trouve dans un autre package ( un autre plugin )
Est il possible de faire ça ?
si c'est le cas Merci de me dire comment ?
Merci d'avance
bonjour
Je veux créer une interface dont le noms est le résultat d'un get qui se trouve dans un autre package ( un autre plugin )
Est il possible de faire ça ?
si c'est le cas Merci de me dire comment ?
Merci d'avance
Ben pas trop, non. Ou alors, ça s'utiliserait comment, ton bazar ?
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Tu peux faire de la compilation à la volée. Mais je vois pas trop l'interet puisque ta classe ne pourra pas l'utiliser. Ou alors, il faudrait aussi créer des classes qui l'utilisent à la volée. Est ce que tu peux mieux expliquer ce que tu cherches à faire ? Il y a peut etre plus simple...
C'est tout à fait possible.
Un petit exemple avec une classe ci dessous. Pour une interface il suffit de faire la même chose et idem pour les classes qui implémenteront l'interfaces.
Prérequis : Il faut que tools.jar (présent dans le JDK soit référencé par le projet)
Le bout de code ci dessous fonctionne, mais on peut très certainement faire mieux.
Il créé un fichier .java contenant le code dans le dossier source du projet, le compile, puis copie le fichier class dans le dossier du projet contenant les classes.
Il utilise ensuite le classLoader pour charger la classe et invoquer une méthode dessus.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 //constantes final String NOM_CLASSE = "ClasseTest"; final String CHEMIN_SOURCE = "src/"; final String CHEMIN_BIN = "bin/"; //Ecriture du .java String s = "public class " + NOM_CLASSE + "{" + " public void foo(){" + " System.out.println(\"Hello World !\"+this.getClass());" + " }" + "}"; FileWriter fw = new FileWriter(CHEMIN_SOURCE + NOM_CLASSE + ".java"); fw.write(s); fw.flush(); fw.close(); //Compilation String[] sources = { CHEMIN_SOURCE + NOM_CLASSE + ".java" }; com.sun.tools.javac.Main.compile(sources); //copie du .class dans un dossier inclu dans le classPath FileChannel in = null; FileChannel out = null; try { in = new FileInputStream(CHEMIN_SOURCE + NOM_CLASSE + ".class") .getChannel(); out = new FileOutputStream(CHEMIN_BIN + NOM_CLASSE + ".class") .getChannel(); in.transferTo(0, in.size(), out); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } if (out != null) { try { out.close(); } catch (IOException e) { } } } //test du chargement de la classe et appel d'une méthode. Class laClasse = Class.forName(NOM_CLASSE); Object instance; try { instance = laClasse.newInstance(); Method foo = laClasse.getDeclaredMethod("foo"); foo.invoke(instance); } catch (Exception e) { e.printStackTrace(); }
Je sais que désormais vivre est un calembour,
La mort est devenue un état permanent,
Le monde est aux fantômes, aux hyènes et aux vautours.
Moi je vous dis bravo et vive la mort.
bonjour
Merci pour votre réponse, juste une autre chose
le nom de l'interface ou la classe ' votre exemple', pour moi est un get dans un autre package, Merci de me dire comment la récupérer ?
et pour les chemin, dois-je les spécifier ou bien quoi ? j'ai pas bien compris
Merci
Y a qu'à (j'adore cette expression :p) faire un petit :
Pour les 2 autres constantes, ce sont celles qui, chez moi, définissent les dossiers sources et bin. Ce n'est pas propre, mais c'était juste pour l'exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part final String NOM_CLASSE = maSuperClasseDansUnPackageObscur.maMéthode();
Ce qu'il faut juste c'est que :
- Le compilateur puisse trouver le fichier .java
- Le fichier .class doit être quelque part dans le classPath de l'application pour pouvoir être chargé.
Je sais que désormais vivre est un calembour,
La mort est devenue un état permanent,
Le monde est aux fantômes, aux hyènes et aux vautours.
Moi je vous dis bravo et vive la mort.
bonjour
Désolée mais vu que je suis débutante en java je suis un peux perdue
voilà j'ai un projet qui contient deux package :
- package instance_tp;
- package isntance_am;
voilà le code du premier ils contient deux classe l'importante pour moi c'est celle la :
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
37
38
39 package instance_tp; import java.util.Iterator; import tp.Templates; import tp.Monde; public class LoadTest { public static void main(String[] args) { // Loading the existing model EMFModelLoad loader = new EMFModelLoad(); Templates templates = loader.load(); for (Iterator<Monde> iterator1 = templates.getMondes().iterator(); iterator1.hasNext();) { Monde monde = iterator1.next(); String X = monde.getMondeName(); System.out.println(" le nom du monde :" +X); } } }
Et je veux récupérer la variable X pour la mettre à la place du get et du set 'comme variable finale et non modifiable dans la classe ci-dessous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package t02; import org.eclipse.emf.ecore.EObject; public interface Monde_Objet extends EObject { String getNameMO(); void setNameMO(String value); } // Monde_Objet
Remarques :
#1 - Si tu veux que ça ne soit pas modifiable, tu devrais modifier l'interface pour qu'elle ne propose pas de set().
#2 - Si tu ne peux pas faire #1 parce que cette interface intervient à certains endroits où il y a besoin de la méthode set(), alors tu devrais utiliser des interfaces distinctes, une qui a set() quand tu as besoin de set(), une qui ne l'a pas quand tu ne veux pas que ça puisse changer.
#3 - En gros tu ne sais pas ce que c'est qu'une interface. Tu as le droit, seulement avant de venir nous demander des trucs, tu pourrais faire l'effort d'étudier ton cours. Débutant ou pas. Quoi qu'il en soit tu dois d'abord savoir ce que c'est, et après demander comment faire des trucs.
#4 - Ce que tu veux, en fait, c'est écrire une classe qui implémente ton interface Monde_Objet. Ça ressemblera à ça :
Je ne peux pas être plus précis parce que ton architecture est mauvaise comme indiqué en #1 et #2, de plus tu ne nous a pas montré l'interface EObject.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public class FixedNameMondeObjet implements MondeObjet { private final name; public FixedNameMondeObjet(String name) { this.name = name; } public String String getNameMO() { return name; } }
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
bonjour
Et Merci pour votre réponse
Nb: je travail sur des plugin EMF-GMF et c'est pas du bazar
Merci encore une fois
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Malheureusement c'est le cas; et je dois trouver une solution.
Merci encore une fois
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager