我一直试图在org.apache.commons.beanutils库中找到一个方法/习惯用来评估两个实例之间所有属性的相等性,即bean的通用equals()方法.
有没有一种简单的方法可以使用这个库?或者我是以错误的方式来做这件事的?谢谢.
Aar*_*lla 19
尝试使用commons-lang的EqualsBuilder.reflectionEquals().EqualsBuilder有一组方法可以包含所有字段,所有非瞬态字段以及除特定字段之外的所有字段.
如果所有其他方法都失败了,那么代码可以作为如何实现它的一个很好的例子.
要直接回答您的问题,您可以使用反射来对bean进行相等性检查.你需要注意一些障碍.
有关于equals()和hashcode()行为的规则.这些规则讨论了对称性,顺从性和反身性,当你的equals方法基于你传入的其他对象动态行为时,这可能很难做到.
有趣的阅读:http: //www.geocities.com/technofundo/tech/java/equalhash.html
一般来说,我认为你最好创建自己的哈希码并等于方法.有一个很好的插件可以根据类属性自动为您生成代码.
说完这一切之后,这里有一些(旧式)方法来获取我很久以前写过的getter,setter和properties:
private Map getPrivateFields(Class clazz, Map getters, Map setters) {
Field[] fields = clazz.getDeclaredFields();
Map m = new HashMap();
for (int i = 0; i < fields.length; i++) {
int modifiers = fields[i].getModifiers();
if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers)) {
String propName = fields[i].getName();
if (getters.get(propName) != null && setters.get(propName) != null) {
m.put(fields[i].getName(), fields[i]);
}
}
}
return m;
}
Run Code Online (Sandbox Code Playgroud)
吸气剂:
private Map getGetters(Class clazz) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("get")) {
int modifiers = methods[i].getModifiers();
if (validAccessMethod(modifiers)) {
m.put(getPropertyName(methods[i].getName()), methods[i]);
}
}
}
return m;
}
Run Code Online (Sandbox Code Playgroud)
塞特犬:
private Map getSetters(Class clazz, Map getters) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("set")) {
int modifiers = methods[i].getModifiers();
String propName = getPropertyName(methods[i].getName());
Method getter = (Method) getters.get(propName);
if (validAccessMethod(modifiers) && getter != null) {
Class returnType = getter.getReturnType();
Class setType = methods[i].getParameterTypes()[0];
int numTypes = methods[i].getParameterTypes().length;
if (returnType.equals(setType) && numTypes == 1) {
m.put(propName, methods[i]);
}
}
}
}
return m;
}
Run Code Online (Sandbox Code Playgroud)
也许你可以用这个来推动你自己.
编辑:当然,Aaron Digulla的反应建设者的回答比我的手工要好得多.
| 归档时间: |
|
| 查看次数: |
19162 次 |
| 最近记录: |