Получить имя поля из метода получения - PullRequest
0 голосов
/ 01 февраля 2019

Мне необходимо динамически проверять имя поля метода получения для динамической проверки и динамического форматирования.Каков наилучший и эффективный способ сделать это.

public class Emp{
    private String firstName;
    private String lastName;
    private String address;
    private int age;

    // getter and setters
}


public class MyImplementationClass{

    public execute(Emp emp){
        String fName=emp.getFirstName();
        // field name need to be taken here using 'emp.getFirstName()'
        // need field name and value of return value of 'emp.getFirstName()' for dynamic validation and dynamic formatting.
        // here need to call method validateAndFormat() with field name and value.
    }
}

private String validateAndFormat(String fieldName,String value){
 // read the dynamic validation settings from the xml and  validate/reformat the value
 // this method will validate the field according to xml and return reformatted value.
}
private int validateAndFormat(String fieldName,int value){
//...
}

настройки динамической проверки

<message>
    <element field="firstName" length="22" defaultVal=""></element>
    <element field="lastName" length="20" defaultVal="ibft"></element>
    <element field="address" length="NA" defaultVal=""></element>
    <element field="age" length="NA" defaultVal=""></element>
</message>

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Вы можете использовать отражение Java.Но получение имени поля от получателя может быть не очень хорошим дизайном, так как получатель может не поддерживаться полем.Рассмотрим приведенный ниже метод получения.

public int getExp(){
    return today-joiningDate();
}

Это не поддерживается полем.

Вместо этого, если вы хотите указать только имя и значение поля, вы можете достичь, как показано ниже.

Class class1 = employee.getClass();
Field[] fields= class1.getDeclaredFields();
    for(Field field:fields){
        try {
            field.setAccessible(true);
            System.out.println(field.getName()+":"+field.get(bean));
        } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

Надеюсь, это поможет.

0 голосов
/ 01 февраля 2019
Можно выбрать

аннотацию.

public @interface MyField {
    String fieldName() default "";
}

и использовать ее для вашего метода

@MyField("firstName")
getFirstName(){
   ...
}

, затем получить fieldName путем отражения.я думаю, что этот способ является более гибким, чем генерировать имя поля из имени метода.

0 голосов
/ 01 февраля 2019

использовать getMethods получить все открытые методы emp

, затем выбрать метод getXXX и вызвать его

        Emp emp = new Emp();
        emp.setAddress("myAdress");
        emp.setAge(20);
        emp.setFirstName("myFirstName");
        emp.setLastName("myLastName");
        Class clz = emp.getClass();

        Method[] methods = clz.getMethods();
        for (Method method : methods) {
            String methodName = method.getName();
            if (!Objects.equals(methodName, "getClass")
                    && methodName.startsWith("get")
                    && methodName.length() > 3
                    && method.getParameterTypes().length == 0) {

                String field = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
                Object value = method.invoke(emp);
                System.out.println("field:" + field + ",value:" + value);
            }
        }

вы также можете использовать getDeclaredFields получить все частные поля

и найдите метод getXXX по полю

        Field[] fields = clz.getDeclaredFields();
        for (Field field : fields) {
            String fieldName = field.getName();
            String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            try {
                Method method = clz.getMethod(methodName);
                Object value = method.invoke(emp);
                System.out.println("field:" + fieldName + ",value:" + value);
            } catch (NoSuchMethodException e) {
                System.out.println("no such method:" + methodName);
            }
        }
...