找到 class 的吸气剂的最佳方法是什么
What's the best way to find the getters of a class
我有一个for (Field field : CLASS.getDeclaredFields())
我想找到 如果 CLASS 中的每个字段 都有一个 getter 方法 returns它的价值
所以我在那个循环中使用:
List<Field> FieldGettersNotFound = new ArrayList<>();
for (PropertyDescriptor descriptor : Introspector.getBeanInfo(CLASS).getPropertyDescriptors()){
//Check for getters
if (descriptor.getReadMethod() != null){
if (!( descriptor.getReadMethod().getParameters().length == 0 &&
descriptor.getReadMethod().getReturnType().equals(field.getType()))){
if (!FieldGettersNotFound.contains(field)) FieldGettersNotFound.add(field);
}
else {
FieldGettersNotFound.remove(field);
break;
}
}
}
if (FieldGettersNotFound.size()>0) throw an Exception;
看起来还好,但是遇到这种情况,并没有抛出异常
因为程序正在双重检查 getName();
public class RandomSituation {
private String Name;
private String LastName;
public String getName(){
return Name;
}
}
解决此问题的一种方法是:
(我只是在 else 中添加了 1 if)
for (PropertyDescriptor descriptor : Introspector.getBeanInfo(CLASS).getPropertyDescriptors()){
//Check for getters
if (descriptor.getReadMethod() != null){
if (!( descriptor.getReadMethod().getParameters().length == 0 &&
descriptor.getReadMethod().getReturnType().equals(field.getType()))){
if (!FieldGettersNotFound.contains(field)) FieldGettersNotFound.add(field);
}
else {
if (descriptor.getReadMethod().getName().equals("get"+field.getName()){
FieldGettersNotFound.remove(field);
break;
}
}
}
}
但一些精神病患者可能会调用他们的方法 returnName() 或类似这样的东西
如果 class 的所有字段都有 getter 方法,是否有更好的方法来检查 ?
好吧,解决方案非常简单...
我刚刚创建了一个 List<Method> Getters = new ArrayList<>();
来跟踪我检查过的每个方法
for (PropertyDescriptor descriptor : Introspector.getBeanInfo(CLASS).getPropertyDescriptors()){
//Check for getters
if (descriptor.getReadMethod() != null && !Getters.contains(descriptor.getReadMethod())){
if (!( descriptor.getReadMethod().getParameters().length == 0 &&
descriptor.getReadMethod().getReturnType().equals(field.getType()))){
if (!FieldGettersNotFound.contains(field)) FieldGettersNotFound.add(field);
}
else {
FieldGettersNotFound.remove(field);
Getters.add(descriptor.getReadMethod());
break;
}
}
}
我有一个for (Field field : CLASS.getDeclaredFields())
我想找到 如果 CLASS 中的每个字段 都有一个 getter 方法 returns它的价值
所以我在那个循环中使用:
List<Field> FieldGettersNotFound = new ArrayList<>();
for (PropertyDescriptor descriptor : Introspector.getBeanInfo(CLASS).getPropertyDescriptors()){
//Check for getters
if (descriptor.getReadMethod() != null){
if (!( descriptor.getReadMethod().getParameters().length == 0 &&
descriptor.getReadMethod().getReturnType().equals(field.getType()))){
if (!FieldGettersNotFound.contains(field)) FieldGettersNotFound.add(field);
}
else {
FieldGettersNotFound.remove(field);
break;
}
}
}
if (FieldGettersNotFound.size()>0) throw an Exception;
看起来还好,但是遇到这种情况,并没有抛出异常
因为程序正在双重检查 getName();
public class RandomSituation {
private String Name;
private String LastName;
public String getName(){
return Name;
}
}
解决此问题的一种方法是:
(我只是在 else 中添加了 1 if)
for (PropertyDescriptor descriptor : Introspector.getBeanInfo(CLASS).getPropertyDescriptors()){
//Check for getters
if (descriptor.getReadMethod() != null){
if (!( descriptor.getReadMethod().getParameters().length == 0 &&
descriptor.getReadMethod().getReturnType().equals(field.getType()))){
if (!FieldGettersNotFound.contains(field)) FieldGettersNotFound.add(field);
}
else {
if (descriptor.getReadMethod().getName().equals("get"+field.getName()){
FieldGettersNotFound.remove(field);
break;
}
}
}
}
但一些精神病患者可能会调用他们的方法 returnName() 或类似这样的东西
如果 class 的所有字段都有 getter 方法,是否有更好的方法来检查 ?
好吧,解决方案非常简单...
我刚刚创建了一个 List<Method> Getters = new ArrayList<>();
来跟踪我检查过的每个方法
for (PropertyDescriptor descriptor : Introspector.getBeanInfo(CLASS).getPropertyDescriptors()){
//Check for getters
if (descriptor.getReadMethod() != null && !Getters.contains(descriptor.getReadMethod())){
if (!( descriptor.getReadMethod().getParameters().length == 0 &&
descriptor.getReadMethod().getReturnType().equals(field.getType()))){
if (!FieldGettersNotFound.contains(field)) FieldGettersNotFound.add(field);
}
else {
FieldGettersNotFound.remove(field);
Getters.add(descriptor.getReadMethod());
break;
}
}
}