如何使用只有部分名称的java反射作为方法的字符串来获取方法?

时间:2017-02-20 09:09:16

标签: java reflection getter java.lang

我正在尝试调用类的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()方法。请帮助。

3 个答案:

答案 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)

嗯,嗯,真的不是一个想法,你必须要么是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;
}

并且用户将名称作为输入....

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

答案 2 :(得分:0)

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

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