Вы можете использовать AdminLogin.class.getDeclaredMethods()
и использовать цикл for для сопоставления всех методов некоторым действиям, так как тогда вы можете читать параметры, используя method.getParameters()
, но учтите, что параметры могут не иметь имени - это должно быть включено в компиляторе, используя -parameters
флаг.
Подтверждение концепции:
Map<String, Callable> mappedMethods = new HashMap<>(); // you can use runnable etc, I used callable as I don't want to catch exceptions in this example code - you should.
AdminLogin instance = new AdminLogin();
WebElement usernameElement = null; // idk how you get instance of this
WebElement passwordElement = null; // idk how you get instance of this
for (Method method : AdminLogin.class.getDeclaredMethods()) {
Parameter[] parameters = method.getParameters();
Object[] args = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
Parameter parameter = parameters[i];
if ((parameter.getType() == WebElement.class) && parameter.getName().equals("username")) {
args[i] = usernameElement;
}
else if ((parameter.getType() == WebElement.class) && parameter.getName().equals("password")) {
args[i] = passwordElement;
} else {
// log some info/throw exception, whatever you need for methods that can't be mapped
break;
}
}
mappedMethods.put(method.getName(), () -> method.invoke(instance, args));
}
И теперь вы можете просто назвать эти вызываемые объекты по имени с карты.
Но обратите внимание, что вам следует добавить больше абстракции, как таковойСтена ifs, если у вас есть больше типов аргументов для обработки или дублирования этого кода для каждого класса, это будет плохой идеей.
Также читайте об аннотациях в java, они полезны для обозначения специальных методов и параметров, подобных этому, но незлоупотребляйте ими тоже.
Также обратите внимание, что getDeclaredMethods
возвращает методы не в определенном порядке и, конечно, не в том порядке, который объявлен в классе.