Passage de fonction en argument

Résolu/Fermé
dadita Messages postés 9 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 25 août 2013 - 14 juil. 2013 à 15:15
dadita Messages postés 9 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 25 août 2013 - 19 juil. 2013 à 13:39
Bonjour,

sous matlab on peut utiliser des pointeurs (ou adresses) vers une fonction pour permettre le passage de fonction en argument, ces pointeurs sont appelés des Handles
y a t'il un équivalent des handles de matlab en java?

par exemple:

ptr=@sin

transformation(ptr,0,pi/2,100)

comment faire ça en java?

Merci d'avance


1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 14/07/2013 à 17:08
En Java il n'y a pas de pointeur, pour la simple et bonne raison que l'on n'accède pas directement à la mémoire de l'ordinateur car celle-ci est gérée par la machine virtuelle. La manipulation des objets se fait par référence, ces références sont parfois appelées "handle" mais je trouve que c'est un abus de langage.

Pour faire ce que tu veux en Java il faudrait faire très différemment, on appelle ça de l'introspection, c'est à dire qu'on va chercher un objet qui correspond à une classes, puis on applique des méthodes sur l'objet Class pour récupérer un objet Method qui correspond à la méthode que l'on souhaite manipuler.

Par exemple voici une simple récupération des méthodes Math.sinus et Math.cosinus auxquelles on passe en paramètre la valeur π/2 via la méthode "appel" :

import java.lang.reflect.Method;

public class essai
{
    public static void main(String[] args) throws Exception
    {
        Class<?> math = Class.forName("java.lang.Math");
        
        Method sinus = math.getMethod("sin", double.class);
        Method cosinus = math.getMethod("cos", double.class);
        
        double valeur = Math.PI/2;

        double resultat_sin = appel(sinus,valeur);
        double resultat_cos = appel(cosinus,valeur);

        System.out.println(resultat_sin); // 1.0
        System.out.println(resultat_cos); // 0.0
    }
    
    private static double appel(Method methode, double valeur) throws Exception
    {
        return (double) methode.invoke(null,valeur);
    }
}
La confiance n'exclut pas le contrôle
2
dadita Messages postés 9 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 25 août 2013
19 juil. 2013 à 13:39
je vous remercie KX pour votre réponse
problème résolu :)
0