2017-02-20 14 views
0

Я пытаюсь вызвать getter класса, у меня есть только частичное имя, такое как «Name», «age» и т. Д. Мне нужно вызывать метод из класса типа getName/retriveName динамически на основе геттеров с использованием java Reflection апи.Как получить метод с использованием java-отражения только с частичным именем в виде строки метода?

для например:

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" на основе пользовательского ввода, я должен вызвать метод GetName() только. Незлая помощь.

+1

Transform вход в нижний регистр, а затем заглавной буквы, затем добавьте полученную строку в '' getPerson'', чтобы получить полное имя метода? – Berger

ответ

0

Эммм, п OT действительно GOOT идея, вы должны либо методы 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; 
} 

и пользователь дает имя в качестве входных данных ....

тогда, возможно, вы будете ссылаться на неправильный метод ....

0

Имея personName, personAge и personId поля внутри класса с именем PersonData обычно (но не всегда) плохая практика, это очень избыточна и это антипаттерн даже имеет имя: smurf naming.

Но, к счастью, вопрос не зависит. Чтобы получить значение свойства на основе частичного совпадения, вам нужно будет перечислить все свойства getters и выбрать тот, чье имя содержит предоставленную строку.

0

В 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 который вернулся: Янек»

+0

Вы можете использовать 'Arrays.stream (PersonData.class.getDeclaredMethods())' вместо 'asList (...) .stream()' объезд. – Holger