如何使用Java反射获取仅部分名称作为方法字符串的方法?



我正在尝试调用一个类的getter,我只有部分名称,例如"名称","年龄"等。我需要使用 java Reflection API 根据 getter 动态调用 getName/retriveName 等类的方法。

例如:

class PersonData{
private String personName;
private int personId;
private int personAge;
public PersonData(){
}
public int getPersonId(){
return this.personID;
}
public String getPersonName(){
return this.personName;
}
public int getPersonAge(){
return this.PersonAge;
}
}

我可能会根据用户输入获得"名称"/"名称",我应该只调用方法 getName()。请帮忙。

在 Java 8 中,你可以这样做:

public static void main(String[] args) throws Exception {
final PersonData person = new PersonData("Janek", 111, 59);
final Method method = getMethodLike("naMe");
final Object output = method.invoke(person);
System.out.println("Found method with name: " + method.getName() + " which returned: " + output);

}
private static Method getMethodLike(String partOfName) {
final Optional<Method> matchedMethod = asList(PersonData.class.getDeclaredMethods()).stream().filter(method ->
method.getName().toLowerCase().indexOf(partOfName.toLowerCase()) >= 0).findAny();
if (!matchedMethod.isPresent()) {
throw new RuntimeException("No method containing: " + partOfName);
}
return matchedMethod.get();
}

输出:"找到名称为:getPersonName 的方法,返回:Janek">

嗯,真的是一个傻瓜的想法,你必须要么 GETALL 方法并按名称搜索(例如正则表达式)要么提供你想要调用的 mothod 的洞全名......

PersonData i = new PersonData();
String userInp = "name";
Class<PersonData> ri = (Class<PersonData>) Class.forName(PersonData.class.getName());
Method[] m = ri.getDeclaredMethods();
for (Method method : m) {
System.out.println(method);
if (method.getName().toLowerCase().indexOf(userInp.toLowerCase()) != -1) {
System.out.println("....method found! -> " + method);
break;
}
}

现在考虑一下如果你的类有一些类似

public String getContentNamespace() {
return aNamespace;
}

并且用户提供名称作为输入。

那么也许你会调用错误的方法....

在名为PersonData的类中拥有personNamepersonAgepersonId字段通常是(但并非总是)不好的做法,它是高度冗余的,这个反模式甚至有一个名称:smurf naming

但幸运的是,这个问题是独立的。要获得基于部分匹配的属性值,您必须列出所有属性 getter 并选择名称包含所提供字符串的属性获取器。