From 0a5a7139f9ebbb6da7ed985296f8dbcb4731638c Mon Sep 17 00:00:00 2001 From: wxm <115806199+youfanx@users.noreply.github.com> Date: Wed, 27 Sep 2023 15:35:22 +0800 Subject: [PATCH] up reflects --- .../src/main/java/org/rx/bean/RandomList.java | 3 +- rxlib/src/main/java/org/rx/core/Cache.java | 9 ++++-- .../src/main/java/org/rx/core/Constants.java | 4 +++ rxlib/src/main/java/org/rx/core/Reflects.java | 31 ++++++++++++++++--- .../java/org/rx/core/YamlConfiguration.java | 26 +++++++++------- .../org/rx/exception/YamlCodeHandler.java | 5 +-- .../java/org/rx/io/JdkAndJsonSerializer.java | 10 +++--- .../main/java/org/rx/net/dns/DnsServer.java | 2 +- .../org/rx/net/support/EndpointTracer.java | 3 +- .../java/org/rx/net/support/SocksSupport.java | 3 +- .../main/java/org/rx/spring/Interceptors.java | 3 ++ .../src/main/java/org/rx/util/Validator.java | 13 ++++++++ rxlib/src/test/java/org/rx/core/TestCore.java | 2 +- 13 files changed, 84 insertions(+), 30 deletions(-) diff --git a/rxlib/src/main/java/org/rx/bean/RandomList.java b/rxlib/src/main/java/org/rx/bean/RandomList.java index 0938b22c..9187d0df 100644 --- a/rxlib/src/main/java/org/rx/bean/RandomList.java +++ b/rxlib/src/main/java/org/rx/bean/RandomList.java @@ -7,6 +7,7 @@ import org.rx.core.Cache; import org.rx.core.CachePolicy; import org.rx.core.Linq; +import org.rx.core.cache.MemoryCache; import org.rx.util.function.BiFunc; import java.io.Serializable; @@ -63,7 +64,7 @@ public T next(S steeringKey, int ttl) { } public T next(S steeringKey, int ttl, boolean isSliding) { - Cache cache = Cache.getInstance(Cache.MEMORY_CACHE); + Cache cache = Cache.getInstance(MemoryCache.class); return cache.get(steeringKey, k -> next(), isSliding ? CachePolicy.sliding(ttl) : CachePolicy.absolute(ttl)); } diff --git a/rxlib/src/main/java/org/rx/core/Cache.java b/rxlib/src/main/java/org/rx/core/Cache.java index b976d384..2522e3c6 100644 --- a/rxlib/src/main/java/org/rx/core/Cache.java +++ b/rxlib/src/main/java/org/rx/core/Cache.java @@ -10,8 +10,7 @@ import static org.rx.core.Constants.NON_RAW_TYPES; public interface Cache extends AbstractMap { - Class MEMORY_CACHE = MemoryCache.class; - Class DISK_CACHE = DiskCache.class; + Object NULL_VALUE = new Object(); static TV getOrSet(TK key, BiFunc loadingFunc) { return getOrSet(key, loadingFunc, null); @@ -25,6 +24,12 @@ static Cache getInstance() { return IOC.get(Cache.class); } + /** + * @param cacheType MEMORY_CACHE, DISK_CACHE + * @param + * @param + * @return + */ @SuppressWarnings(NON_RAW_TYPES) static Cache getInstance(Class cacheType) { return IOC.get(cacheType, (Class) MemoryCache.class); diff --git a/rxlib/src/main/java/org/rx/core/Constants.java b/rxlib/src/main/java/org/rx/core/Constants.java index d58d6c4c..8d622bea 100644 --- a/rxlib/src/main/java/org/rx/core/Constants.java +++ b/rxlib/src/main/java/org/rx/core/Constants.java @@ -45,6 +45,10 @@ enum MetricName { String ENABLE_FLAG = "1"; + String CACHE_REGION_ERROR_CODE = "ERR"; + String CACHE_REGION_BEAN_PROPERTIES = "PROP"; + String CACHE_REGION_INTERFACE_METHOD = "IM"; + String CACHE_REGION_SKIP_SERIALIZE = "SS"; /** * do not edit */ diff --git a/rxlib/src/main/java/org/rx/core/Reflects.java b/rxlib/src/main/java/org/rx/core/Reflects.java index b58d5971..19b370da 100644 --- a/rxlib/src/main/java/org/rx/core/Reflects.java +++ b/rxlib/src/main/java/org/rx/core/Reflects.java @@ -307,7 +307,7 @@ public static T invokeDefaultMethod(Method method, Object instance, Object.. Class declaringClass = method.getDeclaringClass(); MethodHandle methodHandle; -// if (App.IS_JAVA_11) { +// if (Sys.IS_JAVA_11) { // methodHandle = MethodHandles.lookup() // .findSpecial( // method.getDeclaringClass(), @@ -371,9 +371,32 @@ public static T invokeMethod(Method method, TT instance, Object... args) return (T) method.invoke(instance, args); } + public static Method getInterfaceMethod(Method method) { + Cache cache = Cache.getInstance(MemoryCache.class); + Object v = cache.get(method, k -> { + Class type = method.getDeclaringClass(); + NoSuchMethodException lastEx = null; + for (Class i : type.getInterfaces()) { + try { + return i.getMethod(method.getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + lastEx = e; + } + } + if (lastEx != null) { + log.warn("getInterfaceMethod", lastEx); + } + return Cache.NULL_VALUE; + }); + if (v == Cache.NULL_VALUE) { + return null; + } + return (Method) v; + } + public static Map> getMethodMap(Class type) { return methodCache.getValue().get(type, k -> { - List all = new ArrayList<>(); + Set all = new HashSet<>(); for (Class current = type; current != null; current = current.getSuperclass()) { Method[] declared = type.getDeclaredMethods(); //can't get kotlin private methods for (Method method : declared) { @@ -397,8 +420,8 @@ public static Map> getMethodMap(Class type) { //region fields public static Linq getProperties(Class to) { - Cache> cache = Cache.getInstance(Cache.MEMORY_CACHE); - return cache.get(fastCacheKey("prop", to), k -> { + Cache> cache = Cache.getInstance(MemoryCache.class); + return cache.get(fastCacheKey(Constants.CACHE_REGION_BEAN_PROPERTIES, to), k -> { Method getClass = Object.class.getDeclaredMethod("getClass"); Linq q = Linq.from(to.getMethods()); Linq> setters = q.where(p -> p.getParameterCount() == 1 && p.getName().startsWith(SET_PROPERTY)).select(p -> Tuple.of(propertyName(p.getName()), p)); diff --git a/rxlib/src/main/java/org/rx/core/YamlConfiguration.java b/rxlib/src/main/java/org/rx/core/YamlConfiguration.java index 0c83d462..62b88883 100644 --- a/rxlib/src/main/java/org/rx/core/YamlConfiguration.java +++ b/rxlib/src/main/java/org/rx/core/YamlConfiguration.java @@ -1,6 +1,7 @@ package org.rx.core; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONReader; import lombok.Getter; import lombok.NonNull; @@ -17,6 +18,7 @@ import java.io.File; import java.io.InputStream; +import java.lang.reflect.Type; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -159,17 +161,17 @@ public T read(String key, T defaultVal) { return val != null ? (T) val : defaultVal; } - public T readAs(Class type) { + public T readAs(Type type) { return readAs(null, type, false); } - public T readAs(String key, Class type) { + public T readAs(String key, Type type) { return readAs(key, type, false); } @ErrorCode("keyError") @ErrorCode("partialKeyError") - public synchronized T readAs(String key, Class type, boolean throwOnEmpty) { + public synchronized T readAs(String key, Type type, boolean throwOnEmpty) { Map tmp = yaml; if (key == null) { return convert(tmp, type); @@ -206,19 +208,21 @@ public synchronized T readAs(String key, Class type, boolean throwOnEmpty return null; } - T convert(Object p, Class type) { + T convert(Object p, Type type) { if (type == null) { return null; } Map map = as(p, Map.class); - if (map != null) { - if (type.equals(Map.class)) { - return (T) map; - } -// new Yaml().loadAs() + boolean isProp = map != null; + if (isProp && type.equals(Map.class)) { + return (T) map; + } + Class clz = as(type, Class.class); + if (isProp || clz == null) { + //new Yaml().loadAs() 不支持嵌套泛型 // return new JSONObject(map).to(type, JSONReader.Feature.SupportClassForName); - return JSON.parseObject(JSON.toJSONString(map), type, JSONReader.Feature.SupportClassForName); + return JSON.parseObject(JSON.toJSONString(p), type, JSONReader.Feature.SupportClassForName); } - return Reflects.changeType(p, type); + return Reflects.changeType(p, clz); } } diff --git a/rxlib/src/main/java/org/rx/exception/YamlCodeHandler.java b/rxlib/src/main/java/org/rx/exception/YamlCodeHandler.java index 71c90401..c65ba69b 100644 --- a/rxlib/src/main/java/org/rx/exception/YamlCodeHandler.java +++ b/rxlib/src/main/java/org/rx/exception/YamlCodeHandler.java @@ -7,6 +7,7 @@ import org.rx.annotation.ErrorCode; import org.rx.bean.Tuple; import org.rx.core.*; +import org.rx.core.cache.MemoryCache; import java.lang.annotation.Annotation; import java.lang.reflect.AccessibleObject; @@ -66,13 +67,13 @@ public MessageFormatter messageFormatter() { return; } - Cache, Method[]>> cache = Cache.getInstance(Cache.MEMORY_CACHE); + Cache, Method[]>> cache = Cache.getInstance(MemoryCache.class); for (StackTraceElement stack : e.getStacks()) { Map messageSource = getMessageSource().readAs(stack.getClassName(), Map.class); if (messageSource == null) { continue; } - Tuple, Method[]> caller = as(cache.get(fastCacheKey("STrace", stack.getClassName()), p -> { + Tuple, Method[]> caller = as(cache.get(fastCacheKey(Constants.CACHE_REGION_ERROR_CODE, stack.getClassName()), p -> { Class type = Reflects.loadClass(stack.getClassName(), false); return Tuple.of(type, type.getDeclaredMethods()); }), Tuple.class); diff --git a/rxlib/src/main/java/org/rx/io/JdkAndJsonSerializer.java b/rxlib/src/main/java/org/rx/io/JdkAndJsonSerializer.java index 3dd60c39..407fd523 100644 --- a/rxlib/src/main/java/org/rx/io/JdkAndJsonSerializer.java +++ b/rxlib/src/main/java/org/rx/io/JdkAndJsonSerializer.java @@ -3,10 +3,8 @@ import lombok.NonNull; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.rx.core.Cache; -import org.rx.core.JsonTypeInvoker; -import org.rx.core.Reflects; -import org.rx.core.Strings; +import org.rx.core.*; +import org.rx.core.cache.MemoryCache; import org.rx.exception.TraceHandler; import java.io.*; @@ -51,9 +49,9 @@ public void serialize(@NonNull T obj, IOStream stream) { @SneakyThrows public void serialize(@NonNull T obj, @NonNull Type type, @NonNull IOStream stream) { - Cache cache = Cache.getInstance(Cache.MEMORY_CACHE); + Cache cache = Cache.getInstance(MemoryCache.class); Class objKls = obj.getClass(); - String skipNS = fastCacheKey("skipNS", objKls); + String skipNS = fastCacheKey(Constants.CACHE_REGION_SKIP_SERIALIZE, objKls); Object obj0 = !cache.containsKey(skipNS) && Serializable.class.isAssignableFrom(objKls) ? obj : new JsonWrapper(type, obj); Compressible c0 = as(obj0, Compressible.class); diff --git a/rxlib/src/main/java/org/rx/net/dns/DnsServer.java b/rxlib/src/main/java/org/rx/net/dns/DnsServer.java index 76dcbf99..565564db 100644 --- a/rxlib/src/main/java/org/rx/net/dns/DnsServer.java +++ b/rxlib/src/main/java/org/rx/net/dns/DnsServer.java @@ -54,7 +54,7 @@ public void setInterceptors(RandomList interceptors) { return; } - DiskCache cache = (DiskCache) Cache.getInstance(Cache.DISK_CACHE); + DiskCache cache = (DiskCache) Cache.getInstance(DiskCache.class); if (ENABLE_AUTO_RENEW) { cache.onExpired.combine((s, e) -> { Map.Entry entry = e.getValue(); diff --git a/rxlib/src/main/java/org/rx/net/support/EndpointTracer.java b/rxlib/src/main/java/org/rx/net/support/EndpointTracer.java index 75a118de..bfbb8207 100644 --- a/rxlib/src/main/java/org/rx/net/support/EndpointTracer.java +++ b/rxlib/src/main/java/org/rx/net/support/EndpointTracer.java @@ -3,6 +3,7 @@ import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import org.rx.core.Cache; +import org.rx.core.cache.MemoryCache; import java.net.SocketAddress; @@ -10,7 +11,7 @@ @Slf4j public final class EndpointTracer { - final Cache index = Cache.getInstance(Cache.MEMORY_CACHE); + final Cache index = Cache.getInstance(MemoryCache.class); String key(SocketAddress sa) { return fastCacheKey("EpTrace", sa); diff --git a/rxlib/src/main/java/org/rx/net/support/SocksSupport.java b/rxlib/src/main/java/org/rx/net/support/SocksSupport.java index 7bb48fe2..14a0827d 100644 --- a/rxlib/src/main/java/org/rx/net/support/SocksSupport.java +++ b/rxlib/src/main/java/org/rx/net/support/SocksSupport.java @@ -2,6 +2,7 @@ import org.rx.core.Arrays; import org.rx.core.Cache; +import org.rx.core.cache.DiskCache; import org.rx.net.dns.DnsServer; import java.math.BigInteger; @@ -20,7 +21,7 @@ public interface SocksSupport extends AutoCloseable, DnsServer.ResolveIntercepto EndpointTracer ENDPOINT_TRACER = new EndpointTracer(); static Cache fakeDict() { - return Cache.getInstance(Cache.DISK_CACHE); + return Cache.getInstance(DiskCache.class); } void fakeEndpoint(BigInteger hash, String realEndpoint); diff --git a/rxlib/src/main/java/org/rx/spring/Interceptors.java b/rxlib/src/main/java/org/rx/spring/Interceptors.java index 0207ff87..d6a8a4db 100644 --- a/rxlib/src/main/java/org/rx/spring/Interceptors.java +++ b/rxlib/src/main/java/org/rx/spring/Interceptors.java @@ -184,6 +184,9 @@ protected void onLog(Signature signature, ProceedEventArgs eventArgs, String par protected boolean doValidate(Executable r) { EnableTrace a = r.getAnnotation(EnableTrace.class); + if (a == null) { + a = r.getDeclaringClass().getAnnotation(EnableTrace.class); + } return a != null && a.doValidate(); } } diff --git a/rxlib/src/main/java/org/rx/util/Validator.java b/rxlib/src/main/java/org/rx/util/Validator.java index c905b140..002e0a1d 100644 --- a/rxlib/src/main/java/org/rx/util/Validator.java +++ b/rxlib/src/main/java/org/rx/util/Validator.java @@ -2,6 +2,7 @@ import org.rx.annotation.ValidRegex; import org.rx.core.Linq; +import org.rx.core.Reflects; import org.rx.util.function.Func; import javax.validation.ConstraintValidator; @@ -102,6 +103,13 @@ public static T validateMethod(Method member, Object instance, Object[] para for (ConstraintViolation violation : executableValidator.validateParameters(instance, member, parameterValues)) { doThrow(violation); } +// Method interfaceMethod = Reflects.getInterfaceMethod(member); +// boolean hasIM = interfaceMethod != null; +// if (hasIM) { +// for (ConstraintViolation violation : executableValidator.validateParameters(instance, interfaceMethod, parameterValues)) { +// doThrow(violation); +// } +// } if (proceed == null) { return null; @@ -110,6 +118,11 @@ public static T validateMethod(Method member, Object instance, Object[] para for (ConstraintViolation violation : executableValidator.validateReturnValue(instance, member, retVal = proceed.get())) { doThrow(violation); } +// if (hasIM) { +// for (ConstraintViolation violation : executableValidator.validateReturnValue(instance, interfaceMethod, retVal)) { +// doThrow(violation); +// } +// } return retVal; } diff --git a/rxlib/src/test/java/org/rx/core/TestCore.java b/rxlib/src/test/java/org/rx/core/TestCore.java index acbba792..955c4acc 100644 --- a/rxlib/src/test/java/org/rx/core/TestCore.java +++ b/rxlib/src/test/java/org/rx/core/TestCore.java @@ -608,7 +608,7 @@ public void cache() { // BiAction> dump = b -> b.removalListener((k, v, c) -> log.info("onRemoval {} {} {}", k, v, c)); // testCache(new MemoryCache<>(dump)); - DiskCache, Integer> diskCache = (DiskCache) Cache.getInstance(Cache.DISK_CACHE); + DiskCache, Integer> diskCache = (DiskCache) Cache.getInstance(DiskCache.class); testCache(diskCache); System.in.read();