diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java index 76cfee69..44308bb0 100644 --- a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java @@ -30,8 +30,10 @@ import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.stream.Collectors; /** * Register runtime hints for the token library @@ -77,7 +79,9 @@ public class GraalvmNetHints implements RuntimeHintsRegistrar { classes.add(TripleLSS.class); // IPacket - var filterClasses = HintUtils.filterAllClass(clazz -> IPacket.class.isAssignableFrom(clazz)); + var filterClasses = HintUtils.filterAllClass(Collections.emptyList(), List.of(IPacket.class)); + // filter IAttachment + filterClasses = filterClasses.stream().filter(it -> !it.equals(IAttachment.class)).collect(Collectors.toSet()); classes.addAll(filterClasses); // protocol.xml @@ -85,7 +89,7 @@ public class GraalvmNetHints implements RuntimeHintsRegistrar { var resourcePatternResolver = new PathMatchingResourcePatternResolver(); var protocolResources = new HashSet(); protocolResources.addAll(List.of(resourcePatternResolver.getResources("classpath*:/**/*protocol*.xml"))); - protocolResources.addAll(List.of(resourcePatternResolver.getResources("classpath*:/*protocol*.xml"))); + protocolResources.addAll(List.of(resourcePatternResolver.getResources("classpath*:*protocol*.xml"))); for (var protocolResource : protocolResources) { try { var protocolXml = StringUtils.bytesToString(IOUtils.toByteArray(protocolResource.getInputStream())); diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmOrmHints.java b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmOrmHints.java index b8d1d245..03c831f1 100644 --- a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmOrmHints.java +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmOrmHints.java @@ -22,6 +22,8 @@ import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Register runtime hints for the token library @@ -44,7 +46,7 @@ public class GraalvmOrmHints implements RuntimeHintsRegistrar { classes.add(ClassUtils.forName("com.github.benmanes.caffeine.cache.SSLMSA")); classes.add(ClassUtils.forName("com.github.benmanes.caffeine.cache.PSAMS")); - var filterClasses = HintUtils.filterAllClass(clazz -> clazz.isAnnotationPresent(GraalvmNativeEntityCache.class)); + var filterClasses = HintUtils.filterAllClass(List.of(GraalvmNativeEntityCache.class), Collections.emptyList()); classes.addAll(filterClasses); for (var clazz : classes) { diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java index 02ba4da8..c608ac3d 100644 --- a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java @@ -23,6 +23,7 @@ import org.slf4j.LoggerFactory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; +import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -46,7 +47,7 @@ public class GraalvmProtocolHints implements RuntimeHintsRegistrar { classes.add(XmlModuleDefinition.class); classes.add(XmlProtocolDefinition.class); - var filterClasses = HintUtils.filterAllClass(clazz -> clazz.isAnnotationPresent(Protocol.class)); + var filterClasses = HintUtils.filterAllClass(List.of(Protocol.class), Collections.emptyList()); classes.addAll(filterClasses); HintUtils.registerRelevantClasses(hints, classes); diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmStorageHints.java b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmStorageHints.java index b65628cb..111c3f70 100644 --- a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmStorageHints.java +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmStorageHints.java @@ -22,7 +22,9 @@ import org.slf4j.LoggerFactory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; +import java.util.Collections; import java.util.HashSet; +import java.util.List; /** * Register runtime hints for the token library @@ -41,7 +43,7 @@ public class GraalvmStorageHints implements RuntimeHintsRegistrar { classes.add(StorageData.class); classes.add(StorageConfig.class); - var filterClasses = HintUtils.filterAllClass(clazz -> clazz.isAnnotationPresent(GraalvmNativeStorage.class)); + var filterClasses = HintUtils.filterAllClass(List.of(GraalvmNativeStorage.class), Collections.emptyList()); classes.addAll(filterClasses); HintUtils.registerRelevantClasses(hints, classes); diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java b/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java index e97ccd5a..d27e146c 100644 --- a/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java +++ b/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java @@ -12,10 +12,15 @@ package com.zfoo.boot.graalvm; +import com.zfoo.protocol.collection.ArrayUtils; +import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.util.ClassUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.aot.hint.RuntimeHints; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import java.io.IOException; import java.util.HashSet; @@ -32,32 +37,61 @@ public abstract class HintUtils { private static final Logger logger = LoggerFactory.getLogger(HintUtils.class); - /** - * 与set有关的所有内部类包括泛型 - */ - public static Set> filterAllClass(Predicate> predicate) { + + public static Set> filterAllClass(List> annotations, List> interfaces) { + var classes = new HashSet>(); + var annotationNames = annotations.stream().map(it -> it.getName()).toList(); + var interfaceNames = interfaces.stream().map(it -> it.getName()).toList(); + + + var resourcePatternResolver = new PathMatchingResourcePatternResolver(); + var metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); + var resources = new HashSet(); try { - var classes = new HashSet>(); - for (var className : ClassUtils.getAllClasses("")) { - Class clazz = null; - try { - clazz = Class.forName(className); - } catch (Throwable t) { - // do nothing - } - - if (clazz == null) { - continue; - } - - if (predicate.test(clazz)) { - classes.add(clazz); - } - } - return classes; + resources.addAll(List.of(resourcePatternResolver.getResources("classpath*:/**/*.class"))); + resources.addAll(List.of(resourcePatternResolver.getResources("classpath*:*.class"))); } catch (IOException e) { throw new RuntimeException(e); } + + for (var resource : resources) { + if (!resource.isReadable()) { + continue; + } + Class clazz = null; + try { + var metadataReader = metadataReaderFactory.getMetadataReader(resource); + var clazzMeta = metadataReader.getClassMetadata(); + + // check annotation + var annoMeta = metadataReader.getAnnotationMetadata(); + if (annotationNames.stream().anyMatch(it -> annoMeta.hasAnnotation(it))) { + clazz = ClassUtils.forName(clazzMeta.getClassName()); + classes.add(clazz); + continue; + } + + // check interface + if (CollectionUtils.isEmpty(interfaces)) { + continue; + } + var metaInterfaces = metadataReader.getClassMetadata().getInterfaceNames(); + if (ArrayUtils.isEmpty(metaInterfaces)) { + continue; + } + for(var metaInterface : metaInterfaces) { + if (interfaceNames.stream().anyMatch(it -> it.equals(metaInterface))) { + clazz = ClassUtils.forName(clazzMeta.getClassName()); + classes.add(clazz); + break; + } + } + } catch (Throwable t) { + // do nothing + } + } + + return classes; } public static void registerRelevantClasses(RuntimeHints hints, Set> classes) {