从getter方法获取字段名称

时间:2019-02-01 07:18:48

标签: java methods field getter

我需要动态捕获getter方法的字段名称,以进行动态验证和动态格式化。 最佳和有效的方法是什么?

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 :(得分:0)

使用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);
            }
        }

答案 1 :(得分:0)

您可以使用Java反射。但是从getter获取字段名称可能不是一个好的设计,因为getter可能不受字段的支持。考虑下面的吸气剂。

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

希望这会有所帮助。

答案 2 :(得分:0)

注释将是一个选择。

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

并在您的方法上使用它

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

然后通过反射获取fieldName。我认为这种方法比从方法名生成字段名更灵活。