From 19f2775a65fdeb387bd236320705ce76d1241f4e Mon Sep 17 00:00:00 2001 From: godotg Date: Mon, 4 Sep 2023 23:19:59 +0800 Subject: [PATCH] perf[hint]: perfect storage autoconfig --- .../boot/graalvm/GraalvmStorageHints.java | 23 +----- .../java/com/zfoo/boot/graalvm/HintUtils.java | 77 +++++++++++++++++++ 2 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java 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 fc1fe4d6..28cac56f 100644 --- a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmStorageHints.java +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmStorageHints.java @@ -25,6 +25,7 @@ import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import java.util.HashSet; +import java.util.function.Predicate; /** * Register runtime hints for the token library @@ -45,26 +46,10 @@ public class GraalvmStorageHints implements RuntimeHintsRegistrar { classes.add(StorageData.class); classes.add(StorageConfig.class); - try { - for (var className : ClassUtils.getAllClasses("")) { - try { - var clazz = Class.forName(className); - if (!clazz.isAnnotationPresent(GraalvmNativeStorage.class)) { - continue; - } - classes.add(clazz); - classes.addAll(ClassUtils.relevantClass(clazz)); - } catch (Throwable t) { - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } + var filterClasses = HintUtils.filterAllClass(clazz -> clazz.isAnnotationPresent(GraalvmNativeStorage.class)); + classes.addAll(filterClasses); - for (var clazz : classes) { - this.bindingRegistrar.registerReflectionHints(hints.reflection(), clazz); - logger.info("storage graalvm aot hints register serialization [{}]", clazz); - } + HintUtils.registerRelevantClass(hints, classes); for (var resource : StorageEnum.values()) { var include = StringUtils.format("*.{}", resource.getType()); diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java b/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java new file mode 100644 index 00000000..b04e3ef4 --- /dev/null +++ b/boot/src/main/java/com/zfoo/boot/graalvm/HintUtils.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.boot.graalvm; + +import com.zfoo.protocol.util.ClassUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aot.hint.RuntimeHints; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static org.springframework.aot.hint.MemberCategory.*; + +/** + * @author godotg + */ +public abstract class HintUtils { + + private static final Logger logger = LoggerFactory.getLogger(HintUtils.class); + + /** + * 与set有关的所有内部类包括泛型 + */ + public static Set> filterAllClass(Predicate> predicate) { + 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; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void registerRelevantClass(RuntimeHints hints, Set> classes) { + var relevantClasses = classes.stream() + .map(it -> ClassUtils.relevantClass(it)) + .flatMap(it -> it.stream()) + .distinct() + .toList(); + + for (var clazz : relevantClasses) { + hints.reflection().registerType(clazz, DECLARED_FIELDS, INVOKE_PUBLIC_CONSTRUCTORS, INVOKE_PUBLIC_METHODS); + logger.info("zfoo for graalvm aot hints register [{}]", clazz); + } + } + + +}