2 回答
TA贡献1817条经验 获得超6个赞
要通过反射调用方法,您需要三件事:
对象的类名
为其调用方法的类实例
方法参数。
直接从官方文档中拿一个例子,调用一个方法只需写:
Class<?> c = Class.forName(args[0]);
Class[] argTypes = new Class[] { String[].class };
Method main = c.getDeclaredMethod("main", argTypes);
String[] mainArgs = Arrays.copyOfRange(args, 1, args.length);
System.out.format("invoking %s.main()%n", c.getName());
main.invoke(null, (Object)mainArgs);
要显示参数名称,只需查阅java官方文档的另一页,讨论它。
我希望它有帮助。
TA贡献1864条经验 获得超6个赞
您可以使用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返回方法没有特定的顺序,并且肯定与类中声明的顺序不同。
添加回答
举报