From dc285b6c2f58ea541a21aedecc969c429791393d Mon Sep 17 00:00:00 2001 From: Redkale Date: Wed, 6 Jul 2022 22:03:29 +0800 Subject: [PATCH] --- .../org/redkale/util/ResourceFactory.java | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/redkale/util/ResourceFactory.java b/src/main/java/org/redkale/util/ResourceFactory.java index 645b14705..99815bf05 100644 --- a/src/main/java/org/redkale/util/ResourceFactory.java +++ b/src/main/java/org/redkale/util/ResourceFactory.java @@ -8,6 +8,7 @@ package org.redkale.util; import java.lang.annotation.Annotation; import java.lang.ref.WeakReference; import java.lang.reflect.*; +import java.math.*; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -809,30 +810,33 @@ public final class ResourceFactory { this.value = value; this.elements = elements == null ? new CopyOnWriteArrayList<>() : elements; if (sync && elements != null && !elements.isEmpty()) { - for (ResourceElement element : elements) { Object dest = element.dest.get(); - if (dest == null) continue; - Object rs = value; - final Class classtype = element.fieldType; - if (rs != null && !rs.getClass().isPrimitive() && classtype.isPrimitive()) { - if (classtype == int.class) { - rs = Integer.decode(rs.toString()); - } else if (classtype == long.class) { - rs = Long.decode(rs.toString()); - } else if (classtype == short.class) { - rs = Short.decode(rs.toString()); - } else if (classtype == boolean.class) { - rs = "true".equalsIgnoreCase(rs.toString()); - } else if (classtype == byte.class) { - rs = Byte.decode(rs.toString()); - } else if (classtype == float.class) { - rs = Float.parseFloat(rs.toString()); - } else if (classtype == double.class) { - rs = Double.parseDouble(rs.toString()); + if (dest == null) continue; //依赖对象可能被销毁了 + Object newVal = value; + final Class classType = element.fieldType; + if (newVal != null && !newVal.getClass().isPrimitive() && (classType.isPrimitive() || Number.class.isAssignableFrom(classType))) { + if (classType == int.class || classType == Integer.class) { + newVal = Integer.decode(newVal.toString()); + } else if (classType == long.class || classType == Long.class) { + newVal = Long.decode(newVal.toString()); + } else if (classType == short.class || classType == Short.class) { + newVal = Short.decode(newVal.toString()); + } else if (classType == boolean.class || classType == Boolean.class) { + newVal = "true".equalsIgnoreCase(newVal.toString()); + } else if (classType == byte.class || classType == Byte.class) { + newVal = Byte.decode(newVal.toString()); + } else if (classType == float.class || classType == Float.class) { + newVal = Float.parseFloat(newVal.toString()); + } else if (classType == double.class || classType == Double.class) { + newVal = Double.parseDouble(newVal.toString()); + } else if (classType == BigInteger.class) { + newVal = new BigInteger(newVal.toString()); + } else if (classType == BigDecimal.class) { + newVal = new BigDecimal(newVal.toString()); } } - if (rs == null && classtype.isPrimitive()) rs = Array.get(Array.newInstance(classtype, 1), 0); + if (newVal == null && classType.isPrimitive()) newVal = Array.get(Array.newInstance(classType, 1), 0); Object oldVal = null; if (element.listener != null) { try { @@ -842,14 +846,14 @@ public final class ResourceFactory { } } try { - element.field.set(dest, rs); + element.field.set(dest, newVal); } catch (Exception e) { e.printStackTrace(); } if (element.listener != null) { try { - if (!element.different || !Objects.equals(rs, oldVal)) { - element.listener.invoke(dest, name, rs, oldVal); + if (!element.different || !Objects.equals(newVal, oldVal)) { + element.listener.invoke(dest, name, newVal, oldVal); } } catch (Exception e) { logger.log(Level.SEVERE, dest + " resource change listener error", e);