Dieser Artikel ist eine Fortsetzung von Mit einer angehängten Methode herauskommen. Bitte beachten Sie, dass einige Teile leicht beschädigt sind.
Letzter Artikel war nur Stressabbau, aber ich machte mir Sorgen um die Leistung. Ich möchte wissen, wie langsam der Zugriff auf die Reflection-API ist.
Vorerst ließ ich ihn eine Weile erbrechen.
suffixMethodsCaller.java
package suffixMethodsCall;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class suffixMethodsCaller {
/**
* <pre>
*Führen Sie alle Getter mit dem in SuffixMethods enthaltenen Suffix aus.
*Stellen Sie sicher, dass der matchTargetCode am Anfang enthalten ist.
* </pre>
*/
public static void main(String[] args) {
//Messstart
long measureStart = System.currentTimeMillis();
//Zu übereinstimmende Zeichenfolge
String matchTargetCode = "J";
//Codeliste aus der Methode mit Suffix
List<String> codeList = new ArrayList<String>();
//Geben Sie Klasse und Methode als Zeichenfolge an
suffixMethods sm = new suffixMethods();
String clazz = sm.getClass().getName();
String baseSuffixMethod = "getReturnCode";
int suffixPartStart = 1;
int suffixPartEnd = 10;
//Führen Sie eine Methode mit Suffix mithilfe von Reflection aus
try {
Class<?> c = Class.forName(clazz);
Object myObj = c.newInstance();
//Schleifen Sie den Suffix-Teil und tauchen Sie in die Codeliste ein
for ( ; suffixPartStart <= suffixPartEnd; suffixPartStart++) {
//Einstellungen der Ausführungsmethode
Method m = c.getMethod(baseSuffixMethod + String.format("%02d", suffixPartStart));
//In Codeliste packen
codeList.add(m.invoke(myObj).toString());
}
} catch(ReflectiveOperationException e) {
e.printStackTrace();
}
//Ausgabe mit bool, ob die übereinstimmende Zeichenfolge in der Ausführungsergebnisliste der Methode mit Suffix enthalten ist
System.out.println(codeList.contains(matchTargetCode));
//Die Messung ist beendet!
long measureEnd = System.currentTimeMillis();
System.out.println((measureEnd - measureStart) + "ms");
}
}
Ausführungsergebnis
true
44ms
Ich sehe ich sehe. Als nächstes lass uns verrückt werden.
suffixMethodsCaller2.java
package suffixMethodsCall;
public class suffixMethodsCaller2 {
/**
* <pre>
*Führen Sie alle Getter mit dem in SuffixMethods enthaltenen Suffix aus.
*Stellen Sie sicher, dass der matchTargetCode am Anfang enthalten ist.
* </pre>
*/
public static void main(String[] args) {
//Messstart
long measureStart = System.currentTimeMillis();
//Zu übereinstimmende Zeichenfolge
String matchTargetCode = "J";
suffixMethods sm = new suffixMethods();
//Ausgabe mit bool, ob die übereinstimmende Zeichenfolge in der Ausführungsergebnisliste der Methode mit Suffix enthalten ist
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));
//Die Messung ist beendet!
long measureEnd = System.currentTimeMillis();
System.out.println((measureEnd - measureStart) + "ms");
}
}
Ausführungsergebnis
true
1ms
e. .. .. ?? Ja wirklich? Es macht so einen Unterschied.
Ich war ein bisschen besorgt, also noch einer. Es ist ein schlechter Satz, aber ich möchte die Wahrheit umkehren und sehen, ob sich etwas ändert. Ich habe die Genauigkeit auf nanoTime verbessert.
suffixMethodsCaller3.java
package suffixMethodsCall;
public class suffixMethodsCaller3 {
/**
* <pre>
*Führen Sie alle Getter mit dem in SuffixMethods enthaltenen Suffix aus.
*Stellen Sie sicher, dass der matchTargetCode am Anfang enthalten ist.
* </pre>
*/
public static void main(String[] args) {
//Messstart
long measureStart = System.nanoTime();
//Zu übereinstimmende Zeichenfolge
String matchTargetCode = "J";
suffixMethods sm = new suffixMethods();
//Ausgabe mit bool, ob die übereinstimmende Zeichenfolge in der Ausführungsergebnisliste der Methode mit Suffix enthalten ist
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));
//Die Messung ist beendet!
long measureEnd = System.nanoTime();
System.out.println((measureEnd - measureStart) + "ns");
}
}
Es ist schwer zu lesen.
Ausführungsergebnis
false
1127314ns
Hmm. Ich werde versuchen, die vorherige Nano-Bestellung zu machen.
Ausführungsergebnis
true
1100219ns
Oh. Ich habe es mehrmals versucht und das Ergebnis war fast das gleiche. Es ist nur die Überlegenheit oder Unterlegenheit der Lesbarkeit. Ich habe viel gelernt.
Ich bin jedoch überrascht über die Langsamkeit bei der Verwendung von Reflexion. Liegt es daran, dass es eine for-Anweisung gibt? Das Ergebnis war das gleiche, auch wenn ich dachte, ich hätte die Schleife verloren.
Reflexion scheint für Geschäftsanwendungen nicht empfohlen zu werden. Ich persönlich mag es, weil es sehr interessant für interne Util usw. verwendet werden kann.
Dieser Artikel begann mit Stressabbau, aber als ich tatsächlich meine Hände bewegte, lernte ich viel. Ich hoffe, es wird jedem helfen.