gpt4 book ai didi

java - 在java中动态调用类方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:47 33 4
gpt4 key购买 nike

是否可以从 java 动态调用类的方法?

例如,假设我有一个类的引用,例如字符串:'com.foo.Bar',或 com.foo.Bar.class,或任何其他需要的..).我有一个字符串数组/列表,例如 [First, Last, Email]

我想简单地遍历这个数组,并在我引用的类上调用方法 'validate' + element。例如:

MyInterface item = //instantiate the com.foo.Bar class here somehow, I'm not sure how.

item.validateFirst();
item.validateLast();
item.validateEmail();

我希望上面的代码行动态发生,所以我可以更改对不同类的引用,并且我的字符串列表中的名称可以更改,但它仍然会调用 validate + name 在它引用的任何类上的方法。

这可能吗?

最佳答案

最简单的方法是使用 reflection

鉴于...

package com.foo;

public class Bar {

public void validateFirst() {
System.out.println("validateFirst");
}

public void validateLast() {
System.out.println("validateLast");
}

public void validateEmail() {
System.out.println("validateEmail");
}

}

你可以使用类似...

String methodNames[] = new String[]{"First", "Last", "Email"};
String className = "com.foo.Bar";
try {

Class classRef = Class.forName(className);
Object instance = classRef.newInstance();

for (String methodName : methodNames) {

try {

Method method = classRef.getDeclaredMethod("validate" + methodName);
method.invoke(instance);

} catch (NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException ex) {
ex.printStackTrace();
}

}

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
ex.printStackTrace();
}

查找方法并执行它们。

您将需要决定处理错误的最佳方式以及它们对您意味着什么,但将想法扩展为可重用的方法并不困难...

更新了评论中讨论的概念想法

鉴于....

public interface Validator {
public boolean isValid(Properties formProperties);
}

我们可以创建一个或多个...

public class UserRegistrationValidator implements Validator {
public boolean isValid(Properties formProperties) {
boolean isValid = false;
// Required fields...
if (formProperties.containsKey("firstName") && formProperties.containsKey("lastName") && formProperties.containsKey("email")) {
// Further processing, valid each required field...
}
if (isValid) {
// Process optional parameters
}
return isValid;
}
}

然后从我们的输入 Controller ,我们可以查看并验证所需的表单

public class FormController ... {

private Map<String, Validator> validators;

public void validForm(String formName, Properties formProperties) {
boolean isValid = false;
Validator validator = validators.get(formName);
if (validator != null) {
isValid = validate.isValid(formProperties);
}
return isValid;
}

}

当然你需要提供一些方法来注册Validators并且根据您使用的 Backbone 框架和您可以使用的参数可能会有所不同(您不必使用 Properties ,但它基本上只是一个 Map<String, String> ...)

关于java - 在java中动态调用类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18778819/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com