我正在尝试调用类的getter,我只有部分名称,如“Name”,“age”等。我需要根据getters使用java动态调用getName / retriveName类中的方法反思api。
例如:
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;
}
}
我可能会根据用户输入得到“name”/“Name”,我应该只调用getName()方法。请帮助。
答案 0 :(得分:1)
在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();
}
输出:&#34;找到名称的方法:返回的getPersonName:Janek&#34;
答案 1 :(得分:0)
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;
}
并且用户将名称作为输入....
那么也许你会调用错误的方法......
答案 2 :(得分:0)
在名为personName
的类中包含personAge
,personId
和PersonData
字段通常(但并非总是)不好的做法,它是高度冗余的,这个反模式甚至有一个姓名:smurf naming
。
但幸运的是,问题是独立的。要根据部分匹配获取属性值,您必须列出所有属性getter并选择名称中包含提供的字符串的属性。