[Résolu] Variable non static depuis une méthode static,Php/Java bridge

Variable non static depuis une méthode static,Php/Java bridge [Résolu] - Java - Programmation

Marsh Posté le 11-03-2008 à 13:27:55    

Bonjour,
 
Voilà une petite question qui me glue depuis qq temps.
 
Considérons une application quelconque. On a la fonction 'main' de la classe 'Main', static bien entendu, et qui me crée un objet de type 'MaClass'. J'ai le choix entre en faire une variable de classe (static au Main) ou bien une variable locale à la méthode 'main'. Dans aucun des cas, cela ne m'arrange.
J'aimerais savoir s'il existe un moyen d'avoir accès à une variable qui ne serait pas static. En gros :
 

Code :
  1. public class Main {
  2.   public void static main (...)
  3.   {
  4.     ...
  5.     MaClass obj = new MaClass();
  6.     ...
  7.   }
  8. }
  9. class bidon {
  10.   un.moyen.daccéder.amon.obj;
  11. }


 
Depuis autre part que mon main, je veux connaitre la référence de l'objet que mon main a créé. Je me demande s'il existe en Java un espèce de mécanisme permettant d'accéder aux objets créés.
J'ai évidemment aussi un problème de portée. Si je veux pouvoir accéder à cet objet, il doit être déclaré en tant qu'attribut de ma classe 'Main' sans pour autant être static je pense.
 
Voilà, si vous m'avez compris, j'espère que vous pourrez m'aider ou me donner des pistes :)
 
Edit: du sujet, pour la recherche :)


Message édité par brolouille le 13-03-2008 à 15:11:27
Reply

Marsh Posté le 11-03-2008 à 13:27:55   

Reply

Marsh Posté le 11-03-2008 à 13:49:25    

par rapport à ton exemple de code, la notion de blocs est importante, et pas tout à fait comprite on dirait.

 

Sinon :

Code :
  1. public class Main {
  2.  
  3.  private MaClass obj; //+ les getters et setters qui vont bien
  4.  
  5.  public void static main (...)
  6.  {
  7.    ...
  8.    _this=new Main();
  9.    _this.obj = new MaClass();
  10.    bidon.doTrucs(_this);
  11.    ...
  12.  }
  13. }
  14.  
  15. class bidon { // c'est vraiment une classe que tu déclares ici ??!
  16.  static void doTrucs(Main main) {
  17.    main.getObj()
  18.  }
  19. }


Message édité par brisssou le 11-03-2008 à 13:53:49

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 11-03-2008 à 13:55:44    

Oui il y a un mécanisme qui permet de faire ce que tu demandes.
Ça s'appelle le passage de paramètres...
 

Code :
  1. public class Main {
  2.   public void static main (...)
  3.   {
  4.     ...
  5.     MaClass obj = new MaClass();
  6.     ...
  7.     Bidon bidon = new Bidon(obj);
  8.   }
  9. }
  10. class Bidon {
  11.   MaClass maClass;
  12.   Bidon(MaClass param) {
  13.     this.maClass = param;
  14.   }
  15. }


 
EDIT : Grilled
 
En gros tu as 2 possibilités, soit tu rends ton objet visible de l'extérieur (via un accesseur getObj()), soit tu le transmets en tant que paramètre là où tu veux l'utiliser.


Message édité par Bidem le 11-03-2008 à 13:59:22
Reply

Marsh Posté le 11-03-2008 à 14:33:44    

Hum hum, ok je complique le truc.
 
Ce que j'utilise, c'est PHP/Java Bridge. De ce que j'ai compris de ce truc, je rajoute 2 lignes de code dans ma classe Main de mon appli. Ca ouvre un socket permettant à Php d'exécuter des commandes Java. La manière dont je veux que Php intéragisse avec Java fait que mon appli est déjà lancée et je dois 'intercepter' depuis Php les objets crées en Java.
 
Une JVM lance l'appli Java. Elle continue à s'exécuter qd je recois une requete Php. Le script charge la classe principale de mon appli et je peux donc voir les attributs et méthode de cette classe. C'est mon seul point d'entrée à mon appli. Je dois donc pouvoir déclarer en tant qu'attribut tous objets qui est crée par ma classe Main. C'est là que ca bloque. J'ai besoin en fait d'avoir en qq sorte accès à tout ce qui a été crée/instancié par la JVM depuis le lancement de l'appli.
 
Pour exemple, un pti code java:

Code :
  1. public class Main {
  2. // Ouverture du socket pour le point d'entrée depuis Php
  3.   public static final String JAVABRIDGE_PORT="8095";
  4.   static final php.java.bridge.JavaBridgeRunner runner = php.java.bridge.JavaBridgeRunner.getRequiredInstance(JAVABRIDGE_PORT);
  5. // L'objet qui doit être public
  6.   public MaClasse unObjQueJaimeraisBienQuilSoitPublic;
  7.   public static void main(String[] args) {
  8.     unObjQueJaimeraisBienQuilSoitPublic = new MaClasse(); // evidemment ca marche pas puisque c'est pas static
  9. // Boucle pour dire que mon appli elle s'arrete pas
  10.     while(true);
  11.   }
  12. }
  13. public class MaClasse {
  14.   private int peuImporte;
  15.   public int getPeuImporte() {...}
  16. }


 
Et mon code php:

Code :
  1. // Connexion au socket
  2. require_once("http://localhost:8095/JavaBridge/java/Java.inc" );
  3. myClass = new ("monPack.Main" );
  4. // Et ca serait cool si ca pouvait marcher comme ca :
  5. echo myClass->unObjQueJaimeraisBienQuilSoitPublic->getPeuImporte();


 
C'est pour ca que je voyais plus un truc du genre accéder depuis php à un arbre des références propre à la JVM, qui me stockerait les ref des objets créés depuis le lancement de l'application. Je sais pas si un truc pareil existe en fait.

Reply

Marsh Posté le 13-03-2008 à 15:09:05    

Bon, j'ai pseudo-contourné mon problème. Je vous met ce que j'ai fais. Ca pourra toujours servir à d'autre.
En fait, j'ai fait une sorte de singleton.
 
Dans ma classe Main:

Code :
  1. public class Main {
  2. // Ouverture du socket pour le point d'entrée depuis Php
  3.   public static final String JAVABRIDGE_PORT="8095";
  4.   static final php.java.bridge.JavaBridgeRunner runner = php.java.bridge.JavaBridgeRunner.getRequiredInstance(JAVABRIDGE_PORT);
  5. // Récupération de l'instance de mon objet public
  6.   public MyInt objet = MyInt.getInstance();
  7.   public static void main(String[] args) {
  8. // Objet de portée interne au main
  9.     MyInt obj = MyInt.getInstance();
  10.     System.out.println(obj.jemanipulemonobjet());
  11. // Boucle pour dire que mon appli ne s'arrete pas
  12.     while(true);
  13.   }
  14. }

On remarque 2 instances de la classe MyInt. En fait, la fonction static getInstance() renvoi une instance sur l'objet déjà créé ou bien crée un nouvel objet si c'est son premier appel (cf code suivant). On a donc en fait objet et obj qui pointe vers le meme objet. Après faut faire gaffe à la synchro...
 
Vla ma classe MyInt:

Code :
  1. public class MyInt {
  2.   private static MyInt INSTANCE = null;
  3.   private int r;
  4.   private int i;
  5.   private MyInt (int r, int i) {
  6.     this.r = r;
  7.     this.i = i;
  8.   }
  9.   public synchronized static MyInt getInstance() {
  10.     if (INSTANCE == null)
  11.       INSTANCE = new MyInt(18,95);
  12.     return INSTANCE;
  13.   }
  14.   public String jemanipulemonobjet() {
  15.     return new String("Mon objet est bien manipulé" );
  16.   }
  17. // ... getter et setter qui vont bien
  18. }

On peut aussi utiliser la fonction getInstance de manière à gérer un pool d'objet pour pouvoir avoir un peu plus que 1 seul objet.
 
Depuis Php, je peux accéder de la même façon à mon objet crée depuis Java:

Code :
  1. // Connexion au socket
  2. require_once("http://localhost:8095/JavaBridge/java/Java.inc" );
  3. $myClass = new ("monPack.Main" );
  4. echo $myClass->objet->jemanipulemonobjet();
  5. echo $myClass->objet->getR();

Bon voila, en tout cas, ca a résolu mon problème. Merci qd meme de m'avoir rappeler que je pouvais faire tout betement un passage de paramètre.
 
A bientot

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed