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

Java Discussion :

[Runtime class loading] Appeler une méthode qui n'existe pas


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Runtime class loading] Appeler une méthode qui n'existe pas
    Bonjour tout le monde,

    Je joue actuellement avec le rechargement de classes à la volée. J'ai une interface 'DynObject' avec une méthode 'getTest():String'. Et un objet 'DynObjectImpl' que je modifie et qui est recompilé, rechargé à la volée et sur lequel je travaille via un Proxy :
    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
    InvocationHandler handler = new InvocationHandler() {
      Logger logger = Logger.getLogger();
      public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable {
        logger.debug("%s is invoking %s with %s", proxy, method, args);
        T obj = currentClass.newInstance();
        return method.invoke(obj, args);
      }
    };
     
    T proxy = (T) Proxy.newProxyInstance(
                parentLoader, new Class[]{DynObject.class}, handler);
    return proxy;
     
    // .. Un peu plus loin
    System.out.println(proxy.getTest());
    Jusque la tout vas bien mais en réalité la classe que je compile à la volée est générée par JAXB. Mon objet compilé à la volée peux donc disposer de nouvelles méthodes non décrites dans l'interface 'DynObject'.
    Or mon but est justement de pouvoir accéder à ces nouvelles méthodes qui ne seront que des accesseurs sur des attributs du bean dynamique.

    Je viens donc vous déranger car il semblerais qu'il soit possible de faire ce que je veux mais je ne vois pas du tout comment le faire.

    J'espère avoir été clair.
    Merci de votre aide.

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    L'usage basique de l'API de réflexion (le bon vieux getDeclaredMethods) ne fonctionne pas avec un proxy dynamique à mon avis. Je suppose que c'est ce que tu as essayé de faire ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Non, je n'ai encore rien éssayé, je constate juste que lorsque l'on demande un nouvelle instance du Proxy, il faut passer un tableau d'interfaces que l'objet est censé réaliser, hors au final ce bean seras remplis par Spring MVC qui utiliseras les accèsseurs.
    Je me demande donc si celà pourras fonctionner et si oui comment je devrais faire.

  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
    Salut,


    Tu veux dire que tu voudrais appeler directement dans le code la méthode getTest() alors qu'elle n'est pas défini dans l'interface DynObject...

    Alors ce n'est pas possible en Java. D'ailleurs il me semble que ce n'est même pas possible au niveau du bytecode pour le moment (voir la JSR 292 concernant invokedynamic).


    Une solution serait peut être de définir une méthode dans DynObject, le nom de la propriété en paramètre et appellerait le getter associé...

    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba
    Une solution serait peut être de définir une méthode dans DynObject, le nom de la propriété en paramètre et appellerait le getter associé...
    Oui surement mais Spring ne sauras pas qu'il doit appeler cette méthode je suppose.

    Bon maintenant le problème est que je veux compiler une classe qui appelle une méthode qui n'existe pas. Mais SI Spring appelle dynamiquement cette méthode via l'api de réflexion par exemple, ça peux fonctionner alors non ?

  6. #6
    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 Blaise1 Voir le message
    Oui surement mais Spring ne sauras pas qu'il doit appeler cette méthode je suppose.
    Oui en effet...


    Question : pourquoi as-tu besoin de passer par un proxy ?

    a++

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/12/2010, 18h29
  2. [Introspection] Savoir quelle classe a appelé une méthode
    Par muad'dib dans le forum Général Java
    Réponses: 2
    Dernier message: 26/11/2008, 16h34
  3. Réponses: 8
    Dernier message: 02/06/2008, 11h56
  4. Demander à une classe l'appel à une méthode
    Par sliderman dans le forum Langage
    Réponses: 3
    Dernier message: 22/01/2008, 14h45
  5. Réponses: 2
    Dernier message: 21/04/2006, 14h32

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