JAVA反射机制获取类中BigDecimal属性值
问题描述
连ORALCE数据库,想搞⼀个BaseService通⽤查询,然后发现被查的表中都有⼀个VersionID字段,需求是只需要取最⼤VersionID的记录即可。这个字段 是⼀个BigDecimal的,那就想着通过反射反回这个字段值,然后再拼查询条件…
报错的代码如下:
public int maxVersion(BaseMapper<T> mapper) throws Exception {
QueryWrapper wrapper = new QueryWrapper();
wrapper.select("VERSIONID").eq("rownum", 1);
bigdecimal转换为integerT t = (T) mapper.selectOne(((QueryWrapper) wrapper));
Object value = null;
if (null != t) {
Field fields[] = t.getClass().getDeclaredFields();
for (Field field : fields) {
String name = Name().toUpperCase();
String type = AnnotatedType().getType().getTypeName();
if ("VERSIONID".equals(name)) {
field.setAccessible(true);
if ("java.math.BigDecimal".equals(type)) {
BigDecimal bigDecimalVar = new (name).toString());
System.out.println(bigDecimalVar);
}
}
}
报错如下所⽰:
java.lang.IllegalArgumentException: Attempt to get java.math.BigDecimal field "xxx.versionid" with illegal data type conversion to long
解决问题
试了好多咱转型⽅案,并跟踪源码,其判断逻辑是在调⽤(name)时,选择UnsafeObjectFieldAccessorImpl类解析,然后在ensureObj(varl)⽅法中判断类型是否⼀臻时报的错,
protected void ensureObj(Object var1) {
if (!DeclaringClass().Class())) {
this.throwSetIllegalArgumentException(var1);
}
}
想放弃了,后来想着把这个对象转成map看看能否成功,结果这个问题解决了,终于可以取到值了,反射也省了。上述报错的⽅法改为:
public int maxVersion(BaseMapper<T> mapper) throws Exception {
QueryWrapper wrapper = new QueryWrapper();
wrapper.select("VERSIONID").eq("rownum", 1);
T t = (T) mapper.selectOne(((QueryWrapper) wrapper));
int maxVersion = 0;
if (null != t) {
BeanMap beanMap = ate(t);
for (Object key : beanMap.keySet()) {
if ("VERSIONID".String().toUpperCase())) {
System.out.(key));
maxVersion = Integer.(key).toString()); }
}
}
return maxVersion;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论