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

avec Java Discussion :

Décompilation et Classes Internes


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Par défaut Décompilation et Classes Internes
    Bonjour,

    Je travaille actuellement sur un projet qui même s'il me pose des problèmes a le mérite de me faire progresser en Java

    J'ai donc hérité d'un JAR éxécutable, que j'ai voulu décompiler afin de le modifier. Après m'être servie de JAD, j'ai reconstitué sous Eclipse un projet avec le code obtenu.

    Dans ce code j'ai découvert des classes nommées par exemple Machin.class et Machin$1.class, et compris que Machin$1.class était une classe interne déclarée au sein même de Machin.class
    Mais malgré des dizaines de cours et de tutoriaux lu et recherches effectuées je ne comprends pas coment intégrer correctement mes classes, et surtout gérer les accès aux diverses méthodes.

    Car Machin$1.class fait appel à des objets et méthodes utilisées dans Machin.class, via des 'access$0' et du coup Eclipse me relève des erreurs dans cette classe.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Machin extends JPanel
        implements ActionListener
    {
    [...]
     
    class Machin$1 implements Runnable
    {
    [...]
     
    Machin.access$0(Machin).méthodeMachin()
     
    [...]
    }
    Je ne comprends donc pas comment reconstituer correctement cette classe, merci d'avance si quelqu'un connait une piste ou une solution à ce problème.

    En espérant m'être correctement exprimée et dans la bonne section.

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Je suis pas sûr de ce que je vais te dire, mais je sais que JAVA utilise un niveau META pour gérer ces classes. Je pense donc que Machin.class représente la méta classe gérant l'ensemble des instances de Machin et que Machin$1.class représente une instance de Machin.

    Renseignes toi sur la méta programmation en JAVA tu y trouveras sans doute ton bonheur.

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Les classes du style Machin$1 sont généralement des classes internes anonymes. Et le access$0(Machin) n'est qu'un accès à l'instance de la classe qui contient la classe interne.

    Par exemple si "Machin$1 implements Runnable" tu devais avoir quelque chose du style:
    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
     
    class Machin {
     
    void méthode() {
      new Thread(new Runnable() {
          public void run() {
              Machin.this.méthodeMachin(); // Machin.access$0(Machin).méthodeMachin()
          }
      }).start();
    }
     
    void méthodeMachin() {
      ...
    }
     
    }

    Edit: je n'ai pas été assez rapide ! Par contre je ne pense pas que ce soit spécifiques aux attributs privés, car si il existe deux méthodes publiques ou autre avec la même signature dans chaque classe, il faut bien les distinguer non ?

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par -gma- Voir le message
    Par contre je ne pense pas que ce soit spécifiques aux attributs privés, car si il existe deux méthodes publiques ou autre avec la même signature dans chaque classe, il faut bien les distinguer non ?
    Les méthodes acces$* concerne uniquement les méthodes/attributs privés.

    S'il y a un conflit de nom, on doit utiliser this.method() ou Machin.this.method() pour spécifier l'une ou autre...


    a++

  5. #5
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Les méthodes acces$* concerne uniquement les méthodes/attributs privés.

    S'il y a un conflit de nom, on doit utiliser this.method() ou Machin.this.method() pour spécifier l'une ou autre...


    a++
    Oui en effet, ça a beaucoup plus de sens que ce que j'ai raconté

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Par défaut
    Merci pour vos réponses je crois y avoir trouvé la solution à mon problème.
    Ce forum m'a toujours aidée en cas de panne, et c'est encore le cas

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pour être plus précis, ta classe Machin$1 est en fait une classe anonyme.

    Et les méthodes 'access$0' correspondent en fait à des méthodes d'accès aux champs private, qui est implicitement généré via le compilateur afin de permettre aux classes internes de manipuler les champs/méthodes privés.

    Bref je suppose que cela devait correspondre à quelque chose comme ceci :
    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
    class Bidule {
    	public void methodeMachin() {
     
    	}
    }
     
     
     
    class Machin {
     
    	private Bidule bidule;
     
    	public void method() {
    		Runnable machin1 = new Runnable() {
    			@Override
    			public void run() {
    				bidule.methodeMachin();
    			}
    		};
    	}
    }

    a++

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

Discussions similaires

  1. [Timer] Classes internes et actionEvent
    Par smag dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/07/2005, 06h51
  2. Heritage de classe avec classes internes
    Par Regis.C dans le forum Langage
    Réponses: 11
    Dernier message: 27/04/2005, 12h19
  3. [heritage] etendre une classe interne en dehors du package
    Par ChristopheH dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2004, 14h15
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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