From fd1e35aaa194d8f471ec66e2295c5e66f59b6afd Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 9 Mar 2022 12:07:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A0JIRA=E9=A1=B9=E7=9B=AE=20=E5=AF=B9Inst?= =?UTF-8?q?all4j=E6=96=B9=E6=B3=95=E7=9A=84=E8=B0=83=E7=94=A8=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E6=94=B9=E7=94=A8=E5=8F=8D=E5=B0=84=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E5=87=BA=E7=8E=B0=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 考核同学使用starter项目,无法进行正常编译,出现类和方法调用异常。 一方面是starter项目没有配置对intall4j的编译依赖导致,另一方面是主jar中 对install4j API的使用没有反射导致 【改动思路】 改用反射方式调用Install4J相关API 【review建议】 --- .../Install4jStartupNotificationProvider.java | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java b/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java index dbc7be2b72..5402032f94 100644 --- a/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java +++ b/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java @@ -1,6 +1,10 @@ package com.fr.design.startup; -import com.install4j.api.launcher.StartupNotification; +import com.fr.invoke.Reflect; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; /** * @author Starryi @@ -18,18 +22,30 @@ public class Install4jStartupNotificationProvider implements FineStartupNotifica @Override public void registerStartupListener(Listener listener) { - boolean supported = false; - try { - supported = Class.forName("com.install4j.api.launcher.StartupNotification") != null; - } catch (Throwable ignored) {} - - if (supported) { - StartupNotification.registerStartupListener(new StartupNotification.Listener() { - @Override - public void startupPerformed(String parameters) { - listener.startupPerformed(parameters); - } - }); + Class StartupNotificationListenerClass = Reflect.on("com.install4j.api.launcher.StartupNotification$Listener").type(); + if (StartupNotificationListenerClass == null) { + return; + } + + ListenerHandler mHandler = new ListenerHandler(listener); + Object listenerCallbackInstance = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { StartupNotificationListenerClass }, mHandler); + Reflect.on("com.install4j.api.launcher.StartupNotification").call("registerStartupListener", listenerCallbackInstance); + } + + private static class ListenerHandler implements InvocationHandler { + private final Listener listener; + + public ListenerHandler(Listener listener) { + this.listener = listener; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (args[0] instanceof String) { + String parameters = (String) args[0]; + listener.startupPerformed(parameters); + } + return null; } } }