Die Klasse, die Sie anrufen möchten. Ich mache nur vier Regeln richtig.
Calc.java
package refrectiontest;
public class Calc {
public int plus(int a, int b) {
return a + b;
}
public int minus(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) {
return a / b;
}
}
Wo kann ich anrufen?
RefrectionTest.java
package refrectiontest;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class RefrectionTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
//Erstellen Sie eine Instanz
Constructor<?> cons = Calc.class.getConstructor();
Calc calc = (Calc) cons.newInstance();
//Registrieren Sie den Funktionsnamen, den Sie verwenden möchten, in der Liste
List<String> methodNames = new ArrayList<>();
methodNames.add("plus");
methodNames.add("minus");
methodNames.add("multiply");
methodNames.add("divide");
//Rufen Sie Funktionen gemeinsam mit dem registrierten Namen auf.
//Wenn die Signatur des Anrufers unterschiedlich ist, muss die for-Anweisung verzweigt oder getrennt werden.
for(String methodName : methodNames){
//Ruft einen Funktionszeiger in einer Methodentypvariablen ab.
//getMethod(Die oben erstellte Klasseninstanz,1. Argument, 2. Argument, 3. ...) der Funktion, die Sie verwenden möchten
//Methode1 für so viele Signaturen, wie Sie verwenden möchten,Definieren Sie es als Methode2.
Method method = (Calc.class.getMethod(methodName,int.class,int.class));
//Verwendung von Funktionen. Da der Rückgabewert von invoke der Objekttyp ist, wandeln Sie ihn entsprechend der Zielfunktion um.
int result = (int)method.invoke(calc,20,10);
System.out.println(methodName + " = " + result );
}
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException ex) {
Logger.getLogger(RefrectionTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Ausgabeergebnis plus = 30 minus = 10 multiply = 200 divide = 2
Dies kann nützlich sein, wenn die Methode als String-Typ angegeben ist. In diesem Beispiel werden Methodennamen einzeln von Hand hinzugefügt. Die Funktionsnamen, die Sie aufrufen möchten, sind Methode1, Methode2, Methode3, Methode4 ... Wenn es eine Seriennummer wie ist
for(int i = 1;i<10;i++){
"method" + String.valuOf(i) ;
}
Möglicherweise können Sie die Verkürzung des Codes messen, wenn er automatisch so generiert wird.
Recommended Posts