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
Version imprimable
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 ?
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:
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(); }
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: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é.
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:
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:
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:
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; } }
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
Malheureusement c'est le cas; et je dois trouver une solution.
Merci encore une fois