我需要动态捕获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>发布于 2019-02-01 16:10:55
使用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);
}
}发布于 2019-02-01 16:19:25
您可以使用Java反射。但是从getter获取字段名可能不是一个好的设计,因为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();
}
}希望这能有所帮助。
发布于 2019-02-01 16:39:55
注释将是一种选择。
public @interface MyField {
String fieldName() default "";
}并在你的方法上使用它
@MyField("firstName")
getFirstName(){
...
}然后通过反射获取fieldName。我认为这种方式比从方法名生成字段名更灵活。
https://stackoverflow.com/questions/54474677
复制相似问题