TP7 question 1

Programmation Avancée

Moderator: douinj

Post Reply
marti_r1
Posts: 66
Joined: 07 Oct 2021 20:16

TP7 question 1

Post by marti_r1 » 10 Dec 2021 15:38

Bonjour,
Si j'ai bien compris l'énoncé de la question 1, j'essaie dans le bloc static (qui ne s’exécutera q'une seule fois) de la classe TableMethodesJavaLangMath de ne sélectionner parmi toutes les méthodes de java.lang.Math uniquement celles qui ont un paramètre de type double ou deux paramètres du type double et qui retournent un double.
Comme il est demandé d'utiliser getMethod(), j'essaie de l'utiliser.
Voila donc ce que j'ai codé :

static{
Class<?> []signatureDouble=new Class<?>[]{double.class};
Class<?> []signatureDoubleDouble=new Class<?>[]{double.class,double.class};
try{
Class<?>classe=Class.forName("java.lang.Math");
for(Method element : classe.getMethods()){
Method methode=classe.getMethod(element.getName(),signatureDouble);
if(methode.getReturnType()==double.class){
tableDesMethodes.put(methode.getName(),methode);
}
}
for(Method element : classe.getMethods()){
Method methode=classe.getMethod(element.getName(),signatureDoubleDouble);
if(methode.getReturnType()==double.class){
tableDesMethodes.put(methode.getName(),methode);
}
}
}catch(ClassNotFoundException cnfe){
System.out.println(cnfe.toString());
}catch(NoSuchMethodException nsme){
System.out.println(nsme.toString());
}
}

Mais j'ai voulu avant tout dans une classe de test que j'ai crée, tester certains fragments de code d'abord.
Le code dessous fonctionne en me retournant et affichant toutes les méthodes de java.lang.Math :

package question1;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.*;

public class Test{
public static void main(String args[]){
Map<String,Method> tableDesMethodes=new Hashtable<String,Method>();
try{
Class<?>classe=Class.forName("java.lang.Math");
for(Method methode : classe.getMethods()){
tableDesMethodes.put(methode.getName(),methode);
}
Set<Map.Entry<String,Method>> s=tableDesMethodes.entrySet();
for(Map.Entry<String,Method> element : s){
System.out.println(element.getKey()+"---"+element.getValue().toGenericString());
}
}catch(ClassNotFoundException cnfe){
System.out.println(cnfe.toString());
}

Résultat :
ulp---public static float java.lang.Math.ulp(float)
nextUp---public static float java.lang.Math.nextUp(float)
sinh---public static double java.lang.Math.sinh(double)
addExact---public static int java.lang.Math.addExact(int,int)
asin---public static double java.lang.Math.asin(double)
cos---public static double java.lang.Math.cos(double)

toString---public java.lang.String java.lang.Object.toString()
nextDown---public static double java.lang.Math.nextDown(double)
wait---public final void java.lang.Object.wait() throws java.lang.InterruptedException
toDegrees---public static double java.lang.Math.toDegrees(double)
floor---public static double java.lang.Math.floor(double)
cosh---public static double java.lang.Math.cosh(double)
log---public static double java.lang.Math.log(double)

getClass---public final native java.lang.Class<?> java.lang.Object.getClass()
hashCode---public native int java.lang.Object.hashCode()
sin---public static double java.lang.Math.sin(double)
notify---public final native void java.lang.Object.notify()
IEEEremainder---public static double java.lang.Math.IEEEremainder(double,double)
tanh---public static double java.lang.Math.tanh(double)

subtractExact---public static long java.lang.Math.subtractExact(long,long)
atan2---public static double java.lang.Math.atan2(double,double)
nextAfter---public static float java.lang.Math.nextAfter(float,double)
max---public static double java.lang.Math.max(double,double)
random---public static double java.lang.Math.random()
multiplyHigh---public static long java.lang.Math.multiplyHigh(long,long)
multiplyExact---public static int java.lang.Math.multiplyExact(int,int)
rint---public static double java.lang.Math.rint(double)
negateExact---public static long java.lang.Math.negateExact(long)
equals---public boolean java.lang.Object.equals(java.lang.Object)
ceil---public static double java.lang.Math.ceil(double)
pow---public static double java.lang.Math.pow(double,double)
expm1---public static double java.lang.Math.expm1(double)

floorDiv---public static long java.lang.Math.floorDiv(long,int)
abs---public static float java.lang.Math.abs(float)
atan---public static double java.lang.Math.atan(double)
log10---public static double java.lang.Math.log10(double)

fma---public static float java.lang.Math.fma(float,float,float)
multiplyFull---public static long java.lang.Math.multiplyFull(int,int)
scalb---public static float java.lang.Math.scalb(float,int)
sqrt---public static double java.lang.Math.sqrt(double)
tan---public static double java.lang.Math.tan(double)

floorMod---public static int java.lang.Math.floorMod(long,int)
toRadians---public static double java.lang.Math.toRadians(double)
hypot---public static double java.lang.Math.hypot(double,double)
signum---public static double java.lang.Math.signum(double)
copySign---public static double java.lang.Math.copySign(double,double)

toIntExact---public static int java.lang.Math.toIntExact(long)
getExponent---public static int java.lang.Math.getExponent(double)
notifyAll---public final native void java.lang.Object.notifyAll()
round---public static int java.lang.Math.round(float)
cbrt---public static double java.lang.Math.cbrt(double)
incrementExact---public static long java.lang.Math.incrementExact(long)
log1p---public static double java.lang.Math.log1p(double)
acos---public static double java.lang.Math.acos(double)

decrementExact---public static int java.lang.Math.decrementExact(int)
min---public static int java.lang.Math.min(int,int)
exp---public static double java.lang.Math.exp(double)

Le soucis vient après à la suite dans cette classe de tests, ce code :

Class<?> []signatureDouble=new Class<?>[]{double.class};
try{
Class<?> classe=Class.forName("java.lang.Math");
for(Method element : classe.getMethods()){
Method methode=classe.getMethod(element.getName(),signatureDouble);
System.out.println(methode.getName()+"---"+methode.toGenericString());
}
}catch(ClassNotFoundException cnfe){
System.out.println(cnfe.toString());
}catch(NoSuchMethodException nsme){
System.out.println(nsme.toString());
}
}

Ne m'affiche pas toutes les méthodes de javaLangMath avec un paramètre de type double mais seulement quelques unes dont pour certaines "il n'arrive pas à lire le nom" avec un abs ? Et après ne semble pas trouver la methode atan2 ?

abs---public static double java.lang.Math.abs(double)
abs---public static double java.lang.Math.abs(double)
abs---public static double java.lang.Math.abs(double)
abs---public static double java.lang.Math.abs(double)
sin---public static double java.lang.Math.sin(double)
cos---public static double java.lang.Math.cos(double)
tan---public static double java.lang.Math.tan(double)
java.lang.NoSuchMethodException: java.lang.Math.atan2(double)

J'ai du mal à bien saisir pourquoi même en ayant regardé comment utiliser getMethod() dans le cours avec ses arguments.
Cordialement

Post Reply