3

我正在尝试调用一个类的getter,我只有部分名称,例如“Name”、“age”等。我需要使用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() 方法。请帮忙。

4

3 回答 3

2

在 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”

于 2017-02-20T09:25:13.177 回答
0

嗯,这不是一个好主意,你必须要么 GETALL 方法并按名称搜索(例如正则表达式),要么提供要调用的方法的洞全名....

    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;
}

并且用户给出名称作为输入....

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

于 2017-02-20T09:14:29.823 回答
0

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

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

于 2017-02-20T09:21:41.283 回答