首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从getter方法获取字段名

从getter方法获取字段名
EN

Stack Overflow用户
提问于 2019-02-01 15:18:48
回答 3查看 2.3K关注 0票数 0

我需要动态捕获getter方法的字段名以进行动态验证和动态格式化。做这件事的最好和有效的方法是什么?

代码语言:javascript
复制
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){
//...
}

动态验证设置

代码语言:javascript
复制
<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>
EN

回答 3

Stack Overflow用户

发布于 2019-02-01 16:10:55

使用getMethods获取emp的所有公共方法

然后选择getXXX方法并调用它

代码语言:javascript
复制
        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方法

代码语言:javascript
复制
        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);
            }
        }
票数 0
EN

Stack Overflow用户

发布于 2019-02-01 16:19:25

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

代码语言:javascript
复制
public int getExp(){
    return today-joiningDate();
}

这不是由字段支持的。

相反,如果您只想要字段名和值,则可以实现如下所示。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-01 16:39:55

注释将是一种选择。

代码语言:javascript
复制
public @interface MyField {
    String fieldName() default "";
}

并在你的方法上使用它

代码语言:javascript
复制
@MyField("firstName")
getFirstName(){
   ...
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54474677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档