我需要动态捕获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>
答案 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。我认为这种方法比从方法名生成字段名更灵活。