Cet article est une suite de Sortez avec une méthode suffixée. Veuillez noter que certaines pièces sont légèrement cassées.
Dernier article était juste un soulagement du stress, mais j'étais préoccupé par les performances. Je veux savoir à quel point l'accès à l'API de réflexion est lent.
Pour le moment, je l'ai laissé vomir pendant un moment.
suffixMethodsCaller.java
package suffixMethodsCall;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class suffixMethodsCaller {
/**
* <pre>
*Exécutez tous les getters avec le suffixe inclus dans suffixMethods,
*Vérifiez que le matchTargetCode au début est inclus.
* </pre>
*/
public static void main(String[] args) {
//Début de la mesure
long measureStart = System.currentTimeMillis();
//Chaîne de caractères à mettre en correspondance
String matchTargetCode = "J";
//Liste de codes obtenue à partir de la méthode avec suffixe
List<String> codeList = new ArrayList<String>();
//Spécifiez la classe et la méthode sous forme de chaîne de caractères
suffixMethods sm = new suffixMethods();
String clazz = sm.getClass().getName();
String baseSuffixMethod = "getReturnCode";
int suffixPartStart = 1;
int suffixPartEnd = 10;
//Exécuter une méthode avec suffixe en utilisant la réflexion
try {
Class<?> c = Class.forName(clazz);
Object myObj = c.newInstance();
//Bouclez la partie suffixe et plongez dans la liste de codes
for ( ; suffixPartStart <= suffixPartEnd; suffixPartStart++) {
//Paramètres de la méthode d'exécution
Method m = c.getMethod(baseSuffixMethod + String.format("%02d", suffixPartStart));
//Pack dans la liste de codes
codeList.add(m.invoke(myObj).toString());
}
} catch(ReflectiveOperationException e) {
e.printStackTrace();
}
//Sortie avec booléen si la chaîne de caractères à mettre en correspondance est incluse dans la liste des résultats d'exécution de la méthode avec suffixe
System.out.println(codeList.contains(matchTargetCode));
//La mesure est terminée!
long measureEnd = System.currentTimeMillis();
System.out.println((measureEnd - measureStart) + "ms");
}
}
Résultat d'exécution
true
44ms
Je vois je vois. Ensuite, devenons fous.
suffixMethodsCaller2.java
package suffixMethodsCall;
public class suffixMethodsCaller2 {
/**
* <pre>
*Exécutez tous les getters avec le suffixe inclus dans suffixMethods,
*Vérifiez que le matchTargetCode au début est inclus.
* </pre>
*/
public static void main(String[] args) {
//Début de la mesure
long measureStart = System.currentTimeMillis();
//Chaîne de caractères à mettre en correspondance
String matchTargetCode = "J";
suffixMethods sm = new suffixMethods();
//Sortie avec booléen si la chaîne de caractères à mettre en correspondance est incluse dans la liste des résultats d'exécution de la méthode avec suffixe
System.out.println(sm.getReturnCode01().equals(matchTargetCode) || sm.getReturnCode02().equals(matchTargetCode)
|| sm.getReturnCode03().equals(matchTargetCode) || sm.getReturnCode04().equals(matchTargetCode)
|| sm.getReturnCode05().equals(matchTargetCode) || sm.getReturnCode06().equals(matchTargetCode)
|| sm.getReturnCode07().equals(matchTargetCode) || sm.getReturnCode08().equals(matchTargetCode)
|| sm.getReturnCode09().equals(matchTargetCode) || sm.getReturnCode10().equals(matchTargetCode));
//La mesure est terminée!
long measureEnd = System.currentTimeMillis();
System.out.println((measureEnd - measureStart) + "ms");
}
}
Résultat d'exécution
true
1ms
e. .. .. ?? vraiment? Cela fait une telle différence.
J'étais un peu inquiet, donc un autre. C'est une mauvaise phrase, mais je veux inverser la vérité et voir s'il y a un changement. J'ai amélioré la précision de nanoTime.
suffixMethodsCaller3.java
package suffixMethodsCall;
public class suffixMethodsCaller3 {
/**
* <pre>
*Exécutez tous les getters avec le suffixe inclus dans suffixMethods,
*Vérifiez que le matchTargetCode au début est inclus.
* </pre>
*/
public static void main(String[] args) {
//Début de la mesure
long measureStart = System.nanoTime();
//Chaîne de caractères à mettre en correspondance
String matchTargetCode = "J";
suffixMethods sm = new suffixMethods();
//Sortie avec booléen si la chaîne de caractères à mettre en correspondance est incluse dans la liste des résultats d'exécution de la méthode avec suffixe
System.out.println(!sm.getReturnCode01().equals(matchTargetCode) && !sm.getReturnCode02().equals(matchTargetCode)
&& !sm.getReturnCode03().equals(matchTargetCode) && !sm.getReturnCode04().equals(matchTargetCode)
&& !sm.getReturnCode05().equals(matchTargetCode) && !sm.getReturnCode06().equals(matchTargetCode)
&& !sm.getReturnCode07().equals(matchTargetCode) && !sm.getReturnCode08().equals(matchTargetCode)
&& !sm.getReturnCode09().equals(matchTargetCode) && !sm.getReturnCode10().equals(matchTargetCode));
//La mesure est terminée!
long measureEnd = System.nanoTime();
System.out.println((measureEnd - measureStart) + "ns");
}
}
C'est difficile à lire.
Résultat d'exécution
false
1127314ns
Hmm. Je vais essayer de faire la précédente nano-commande.
Résultat d'exécution
true
1100219ns
Oh. Je l'ai essayé plusieurs fois et le résultat était presque le même. C'est juste la supériorité ou l'infériorité de la lisibilité. J'ai beaucoup appris.
Cependant, je suis surpris de la lenteur lors de l'utilisation de la réflexion. Est-ce parce qu'il y a une déclaration for? Le résultat était le même même si je pensais avoir perdu la boucle.
La réflexion ne semble pas recommandée pour les applications métiers, Personnellement, je l'aime car il peut être utilisé de manière très intéressante pour les utilitaires internes, etc.
Cet article a commencé avec le soulagement du stress, mais lorsque j'ai bougé mes mains, j'ai beaucoup appris. J'espère que cela sera utile à n'importe qui.
Recommended Posts