From e52cfb036efc36e11b3a4392a1a43b8fe4f59afb Mon Sep 17 00:00:00 2001 From: Glavo Date: Thu, 21 Aug 2025 20:53:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20Task.getCaller()=20(#4308)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jackhuang/hmcl/task/Task.java | 19 +++++-- .../jackhuang/hmcl/util/ReflectionHelper.java | 49 ------------------- 2 files changed, 14 insertions(+), 54 deletions(-) delete mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java index 422308d80..96f6dbc25 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java @@ -24,7 +24,6 @@ import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.ReadOnlyStringWrapper; import org.jackhuang.hmcl.event.EventManager; import org.jackhuang.hmcl.util.InvocationDispatcher; -import org.jackhuang.hmcl.util.ReflectionHelper; import org.jackhuang.hmcl.util.function.ExceptionalConsumer; import org.jackhuang.hmcl.util.function.ExceptionalFunction; import org.jackhuang.hmcl.util.function.ExceptionalRunnable; @@ -35,10 +34,9 @@ import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; -import java.util.function.Supplier; +import java.util.function.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.jackhuang.hmcl.util.logging.Logger.LOG; @@ -1009,8 +1007,19 @@ public abstract class Task { void execute(T result, Exception exception) throws Exception; } + private static final String PACKAGE_PREFIX = Task.class.getPackageName() + "."; + private static final Predicate PREDICATE = stackFrame -> !stackFrame.getClassName().startsWith(PACKAGE_PREFIX); + private static final Function, Optional> FUNCTION = stream -> stream.filter(PREDICATE).findFirst(); + private static final Function FRAME_MAPPING = frame -> { + String fileName = frame.getFileName(); + if (fileName != null) + return frame.getClassName() + '.' + frame.getMethodName() + '(' + fileName + ':' + frame.getLineNumber() + ')'; + else + return frame.getClassName() + '.' + frame.getMethodName(); + }; + private static String getCaller() { - return ReflectionHelper.getCaller(packageName -> !"org.jackhuang.hmcl.task".equals(packageName)).toString(); + return StackWalker.getInstance().walk(FUNCTION).map(FRAME_MAPPING).orElse("Unknown"); } private static final class SimpleTask extends Task { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java deleted file mode 100644 index ee4baf62d..000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2020 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.util; - -import java.util.function.Predicate; - -/** - * - * @author huangyuhui - */ -public final class ReflectionHelper { - private ReflectionHelper() { - } - - /** - * Get caller, this method is caller sensitive. - * - * @param packageFilter returns false if we consider the given package is internal calls, not the caller - * @return the caller, method name, source file, line number - */ - public static StackTraceElement getCaller(Predicate packageFilter) { - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - // element[0] is Thread.currentThread().getStackTrace() - // element[1] is ReflectionHelper.getCaller(packageFilter) - // so element[2] is caller of this method. - StackTraceElement caller = elements[2]; - for (int i = 3; i < elements.length; ++i) { - if (packageFilter.test(StringUtils.substringBeforeLast(elements[i].getClassName(), '.')) && - !caller.getClassName().equals(elements[i].getClassName())) - return elements[i]; - } - return caller; - } -}