From b126872f3c28803fd9d43815789edd5940151648 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Mon, 7 Oct 2024 21:09:52 +0800
Subject: [PATCH 01/28] [support qlexpress]

---
 core/pom.xml                                  |   8 +-
 .../com/taobao/arthas/core/GlobalOptions.java |  24 ++++
 .../core/command/express/ExpressFactory.java  |  39 +++++--
 .../core/command/express/QLExpress.java       | 108 ++++++++++++++++++
 .../core/command/express/QLExpressRunner.java |  34 ++++++
 .../core/command/express/QLGlobalContext.java |  49 ++++++++
 .../core/command/klass100/OgnlCommand.java    |  16 +--
 .../core/command/model/ExpressTypeEnum.java   |  21 ++++
 .../command/model/QLExpressConfigModel.java   |  97 ++++++++++++++++
 pom.xml                                       |   5 +
 10 files changed, 384 insertions(+), 17 deletions(-)
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java

diff --git a/core/pom.xml b/core/pom.xml
index 6899d764cce..e0949c9643e 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -22,8 +22,8 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
-                    <source>1.6</source>
-                    <target>1.6</target>
+                    <source>8</source>
+                    <target>8</target>
                     <encoding>UTF-8</encoding>
                     <showDeprecation>true</showDeprecation>
                 </configuration>
@@ -222,6 +222,10 @@
             <groupId>ognl</groupId>
             <artifactId>ognl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>QLExpress4</artifactId>
+        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 6e623e00c0c..6dc79ac3257 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -11,6 +11,8 @@ public class GlobalOptions {
             + "not allowed to set object properties. "
             + "Want to set object properties, execute `options strict false`";
 
+    public static final String QLEXPRESS_CONFIG = "qlexpress-config";
+
     /**
      * 是否支持系统类<br/>
      * 这个开关打开之后将能代理到来自JVM的部分类,由于有非常强的安全风险可能会引起系统崩溃<br/>
@@ -136,4 +138,26 @@ public class GlobalOptions {
             description = STRICT_MESSAGE
     )
     public static volatile boolean strict = true;
+
+
+    /**
+     * 是否切换使用表达式ognl/qlexpress开关
+     */
+    @Option(level = 1,
+            name = "express-type",
+            summary = "Option to use ognl/qlExpress",
+            description = "Option to use ognl/qlExpress in commands, default ognl"
+    )
+    public static volatile String ExpressType = "ognl";
+
+
+    /**
+     * qlexpress使用参数
+     */
+    @Option(level = 1,
+            name = QLEXPRESS_CONFIG,
+            summary = "config init when use qlExpress, example: {\"\": \"\"} ",
+            description = ""
+    )
+    public static volatile String QLExpressConfig = "";
 }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index d2d578bc17f..a1bba017f00 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -1,18 +1,18 @@
 package com.taobao.arthas.core.command.express;
 
+import com.alibaba.fastjson.JSON;
+import com.taobao.arthas.core.GlobalOptions;
+import com.taobao.arthas.core.command.model.ExpressTypeEnum;
+import com.taobao.arthas.core.command.model.QLExpressConfigModel;
+
 /**
  * ExpressFactory
  * @author ralf0131 2017-01-04 14:40.
  * @author hengyunabc 2018-10-08
  */
 public class ExpressFactory {
-
-    private static final ThreadLocal<Express> expressRef = new ThreadLocal<Express>() {
-        @Override
-        protected Express initialValue() {
-            return new OgnlExpress();
-        }
-    };
+    private static final ThreadLocal<Express> expressRef = ThreadLocal.withInitial(() -> new OgnlExpress());
+    private static final ThreadLocal<Express> expressRefQLExpress = ThreadLocal.withInitial(() -> new QLExpress());
 
     /**
      * get ThreadLocal Express Object
@@ -20,13 +20,38 @@ protected Express initialValue() {
      * @return
      */
     public static Express threadLocalExpress(Object object) {
+        if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) {
+            return expressRefQLExpress.get().reset().bind(object);
+        }
         return expressRef.get().reset().bind(object);
     }
 
     public static Express unpooledExpress(ClassLoader classloader) {
+        if (classloader == null) {
+            classloader = ClassLoader.getSystemClassLoader();
+        }
+        if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) {
+            return new QLExpress(classloader);
+        }
+        return new OgnlExpress(new ClassLoaderClassResolver(classloader));
+    }
+
+    public static Express unpooledExpressByOGNL(ClassLoader classloader) {
         if (classloader == null) {
             classloader = ClassLoader.getSystemClassLoader();
         }
         return new OgnlExpress(new ClassLoaderClassResolver(classloader));
     }
+
+    public static boolean checkQLExpressConfig(String configValue) {
+        try {
+            if ("".equals(configValue)) {
+                return true;
+            }
+            JSON.parseObject(configValue, QLExpressConfigModel.class);
+            return true;
+        }catch (Throwable t){
+            return false;
+        }
+    }
 }
\ No newline at end of file
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
new file mode 100644
index 00000000000..9217bd22398
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -0,0 +1,108 @@
+package com.taobao.arthas.core.command.express;
+
+import com.alibaba.arthas.deps.org.slf4j.Logger;
+import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.InitOptions;
+import com.alibaba.qlexpress4.QLOptions;
+import com.taobao.arthas.core.GlobalOptions;
+import com.taobao.arthas.core.command.model.QLExpressConfigModel;
+
+
+/**
+ * @Author TaoKan
+ * @Date 2024/9/17 6:01 PM
+ */
+public class QLExpress implements Express {
+    private static final Logger logger = LoggerFactory.getLogger(QLExpress.class);
+    private Express4Runner expressRunner;
+    private QLGlobalContext qlGlobalContext;
+    private Object runResult;
+
+    private QLExpressConfigModel qlExpressConfigModel;
+
+    private QLOptions qlOptions;
+
+    private InitOptions initOptions;
+
+    public QLExpress() {
+        initQLExpress();
+        initConfig(null);
+        initContext();
+    }
+
+    public QLExpress(ClassLoader classloader) {
+        initQLExpress();
+        initConfig(classloader);
+        initContext();
+    }
+
+    private void initConfig(ClassLoader classloader) {
+        try {
+            QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class);
+            this.qlExpressConfigModel = qlExpressConfigModel;
+            QLOptions.Builder qlOptionsBuilder = QLOptions.builder();
+            qlOptionsBuilder.cache(qlExpressConfigModel.isCache());
+            qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer());
+            qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength());
+            qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext());
+            qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise());
+            qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis());
+            qlOptions = qlOptionsBuilder.build();
+
+            InitOptions.Builder initOptionsBuilder = InitOptions.builder();
+            initOptionsBuilder.allowPrivateAccess(qlExpressConfigModel.isAllowPrivateAccess());
+            initOptionsBuilder.debug(qlExpressConfigModel.isDebug());
+            initOptionsBuilder.useCacheClear(qlExpressConfigModel.isUseCacheClear());
+            initOptions = initOptionsBuilder.build();
+            //4.0设置InitOptions
+        }catch (Throwable t){
+            //异常不设置options
+            logger.error("Error Init Options For QLExpress:", t);
+        }
+    }
+
+    private void initQLExpress() {
+        expressRunner = QLExpressRunner.getInstance();
+    }
+
+    private void initContext() {
+        qlGlobalContext = new QLGlobalContext();
+    }
+
+    @Override
+    public Object get(String express) throws ExpressException {
+        try {
+            Object result = expressRunner.execute(express, qlGlobalContext, qlOptions);
+            return result;
+        } catch (Exception e) {
+            logger.error("Error during evaluating the expression with QLExpress:", e);
+            throw new ExpressException(express, e);
+        }
+    }
+
+    @Override
+    public boolean is(String express) throws ExpressException {
+        final Object ret = get(express);
+        return ret instanceof Boolean && (Boolean) ret;
+    }
+
+    @Override
+    public Express bind(Object object) {
+        qlGlobalContext.bindObj(object);
+        return this;
+    }
+
+    @Override
+    public Express bind(String name, Object value) {
+        qlGlobalContext.put(name, value);
+        return this;
+    }
+
+    @Override
+    public Express reset() {
+        qlGlobalContext.clear();
+        return this;
+    }
+}
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java
new file mode 100644
index 00000000000..2c6cfee71f6
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java
@@ -0,0 +1,34 @@
+package com.taobao.arthas.core.command.express;
+
+
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.InitOptions;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/9/22 12:20 PM
+ */
+public class QLExpressRunner {
+    private volatile static QLExpressRunner instance = null;
+    private Express4Runner expressRunner;
+
+    private QLExpressRunner(){
+        expressRunner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
+    }
+
+    //对外提供静态方法获取对象
+    public static Express4Runner getInstance(){
+        //第一次判断,如果instance不为null,不进入抢锁阶段,直接返回实例
+        if(instance == null){
+            synchronized (QLExpressRunner.class){
+                //抢到锁之后再次进行判断是否为null
+                if(instance == null){
+                    instance = new QLExpressRunner();
+                }
+            }
+        }
+        return instance.expressRunner;
+    }
+
+
+}
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
new file mode 100644
index 00000000000..1a510178a4b
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
@@ -0,0 +1,49 @@
+package com.taobao.arthas.core.command.express;
+
+import com.alibaba.qlexpress4.exception.PureErrReporter;
+import com.alibaba.qlexpress4.runtime.ReflectLoader;
+import com.alibaba.qlexpress4.runtime.Value;
+import com.alibaba.qlexpress4.runtime.context.ExpressContext;
+import com.alibaba.qlexpress4.runtime.data.MapItemValue;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/9/22 12:39 PM
+ */
+public class QLGlobalContext implements ExpressContext {
+    private Map<String, Object> context;
+    private Object object;
+    private ReflectLoader reflectLoader;
+
+    public QLGlobalContext(Map<String, Object> context, Object bindObject, ReflectLoader reflectLoader) {
+        this.context = context;
+        this.object = bindObject;
+        this.reflectLoader = reflectLoader;
+    }
+
+    public QLGlobalContext() {
+        this.context = new ConcurrentHashMap<>();
+    }
+
+    public void put(String name, Object value){
+        context.put(name, value);
+    }
+
+    public void clear() {
+        context.clear();
+    }
+
+    public void bindObj(Object object) {
+        this.object = object;
+    }
+    @Override
+    public Value get(Map<String, Object> attachments, String variableName) {
+        if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) {
+            return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE);
+        }
+        return new MapItemValue(this.context, variableName);
+    }
+}
diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java
index bb36bb5d91c..6b18a1a1f1d 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java
@@ -31,13 +31,13 @@
 @Name("ognl")
 @Summary("Execute ognl expression.")
 @Description(Constants.EXAMPLE
-                + "  ognl '@java.lang.System@out.println(\"hello \\u4e2d\\u6587\")' \n"
-                + "  ognl -x 2 '@Singleton@getInstance()' \n"
-                + "  ognl '@Demo@staticFiled' \n"
-                + "  ognl '#value1=@System@getProperty(\"java.home\"), #value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}'\n"
-                + "  ognl -c 5d113a51 '@com.taobao.arthas.core.GlobalOptions@isDump' \n"
-                + Constants.WIKI + Constants.WIKI_HOME + "ognl\n"
-                + "  https://commons.apache.org/proper/commons-ognl/language-guide.html")
+        + "  ognl '@java.lang.System@out.println(\"hello \\u4e2d\\u6587\")' \n"
+        + "  ognl -x 2 '@Singleton@getInstance()' \n"
+        + "  ognl '@Demo@staticFiled' \n"
+        + "  ognl '#value1=@System@getProperty(\"java.home\"), #value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}'\n"
+        + "  ognl -c 5d113a51 '@com.taobao.arthas.core.GlobalOptions@isDump' \n"
+        + Constants.WIKI + Constants.WIKI_HOME + "ognl\n"
+        + "  https://commons.apache.org/proper/commons-ognl/language-guide.html")
 public class OgnlCommand extends AnnotatedCommand {
     private static final Logger logger = LoggerFactory.getLogger(OgnlCommand.class);
 
@@ -100,7 +100,7 @@ public void process(CommandProcess process) {
             classLoader = ClassLoader.getSystemClassLoader();
         }
 
-        Express unpooledExpress = ExpressFactory.unpooledExpress(classLoader);
+        Express unpooledExpress = ExpressFactory.unpooledExpressByOGNL(classLoader);
         try {
             Object value = unpooledExpress.get(express);
             OgnlModel ognlModel = new OgnlModel()
diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java
new file mode 100644
index 00000000000..1bc2b6ba36a
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java
@@ -0,0 +1,21 @@
+package com.taobao.arthas.core.command.model;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/9/22 7:32 AM
+ */
+public enum ExpressTypeEnum
+{
+    OGNL("ognl"),
+    QLEXPRESS("QLExpress");
+
+    private String expressType;
+
+    ExpressTypeEnum(String expressType) {
+        this.expressType = expressType;
+    }
+
+    public String getExpressType() {
+        return expressType;
+    }
+}
diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java b/core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java
new file mode 100644
index 00000000000..05348c6213d
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java
@@ -0,0 +1,97 @@
+package com.taobao.arthas.core.command.model;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/9/22 7:51 AM
+ */
+public class QLExpressConfigModel {
+    //QL_OPTIONS
+    private boolean precise = false;
+    private boolean polluteUserContext = false;
+    private long timeoutMillis = -1L;
+
+    private boolean cache = false;
+    private boolean avoidNullPointer = false;
+    private int maxArrLength = -1;
+
+
+    //INIT_OPTIONS
+    private boolean allowPrivateAccess = true;
+    private boolean debug;
+    private boolean useCacheClear;
+
+    public boolean isAllowPrivateAccess() {
+        return allowPrivateAccess;
+    }
+
+    public void setAllowPrivateAccess(boolean allowPrivateAccess) {
+        this.allowPrivateAccess = allowPrivateAccess;
+    }
+
+    public boolean isDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    public boolean isUseCacheClear() {
+        return useCacheClear;
+    }
+
+    public void setUseCacheClear(boolean useCacheClear) {
+        this.useCacheClear = useCacheClear;
+    }
+
+
+
+    public boolean isPrecise() {
+        return precise;
+    }
+
+    public void setPrecise(boolean precise) {
+        this.precise = precise;
+    }
+
+    public boolean isPolluteUserContext() {
+        return polluteUserContext;
+    }
+
+    public void setPolluteUserContext(boolean polluteUserContext) {
+        this.polluteUserContext = polluteUserContext;
+    }
+
+    public long getTimeoutMillis() {
+        return timeoutMillis;
+    }
+
+    public void setTimeoutMillis(long timeoutMillis) {
+        this.timeoutMillis = timeoutMillis;
+    }
+
+    public boolean isAvoidNullPointer() {
+        return avoidNullPointer;
+    }
+
+    public void setAvoidNullPointer(boolean avoidNullPointer) {
+        this.avoidNullPointer = avoidNullPointer;
+    }
+
+    public int getMaxArrLength() {
+        return maxArrLength;
+    }
+
+    public void setMaxArrLength(int maxArrLength) {
+        this.maxArrLength = maxArrLength;
+    }
+
+
+    public boolean isCache() {
+        return cache;
+    }
+
+    public void setCache(boolean cache) {
+        this.cache = cache;
+    }
+}
diff --git a/pom.xml b/pom.xml
index 463cfc3edd1..fc73af016d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -156,6 +156,11 @@
                 <artifactId>ognl</artifactId>
                 <version>3.1.19</version>
             </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>QLExpress4</artifactId>
+                <version>4.0.0-beta</version>
+            </dependency>
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>

From 30fe6897cc84688462a89ef4b3a8d714fdb82b03 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Tue, 8 Oct 2024 19:25:59 +0800
Subject: [PATCH 02/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/pom.xml                                                 | 4 ++++
 .../taobao/arthas/core/command/express/ExpressFactory.java   | 2 +-
 .../com/taobao/arthas/core/command/express/QLExpress.java    | 2 +-
 pom.xml                                                      | 5 +++++
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index cfda902b71d..feab1651739 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -211,6 +211,10 @@
             <groupId>ognl</groupId>
             <artifactId>ognl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>QLExpress4</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.junit.vintage</groupId>
             <artifactId>junit-vintage-engine</artifactId>
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index a1bba017f00..ad072e31398 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -1,6 +1,6 @@
 package com.taobao.arthas.core.command.express;
 
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSON;
 import com.taobao.arthas.core.GlobalOptions;
 import com.taobao.arthas.core.command.model.ExpressTypeEnum;
 import com.taobao.arthas.core.command.model.QLExpressConfigModel;
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 9217bd22398..176f970f706 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -2,7 +2,7 @@
 
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSON;
 import com.alibaba.qlexpress4.Express4Runner;
 import com.alibaba.qlexpress4.InitOptions;
 import com.alibaba.qlexpress4.QLOptions;
diff --git a/pom.xml b/pom.xml
index f6d2061162f..0bff6526a3d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -158,6 +158,11 @@
                 <artifactId>ognl</artifactId>
                 <version>3.4.2</version>
             </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>QLExpress4</artifactId>
+                <version>4.0.0-beta</version>
+            </dependency>
             <dependency>
                 <groupId>org.junit</groupId>
                 <artifactId>junit-bom</artifactId>

From efebecdccecee2281065c73bc39f4c210b16f526 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Tue, 8 Oct 2024 19:27:26 +0800
Subject: [PATCH 03/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/taobao/arthas/core/command/express/ExpressFactory.java  | 2 +-
 .../java/com/taobao/arthas/core/command/express/QLExpress.java  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index ad072e31398..a1bba017f00 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -1,6 +1,6 @@
 package com.taobao.arthas.core.command.express;
 
-import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson.JSON;
 import com.taobao.arthas.core.GlobalOptions;
 import com.taobao.arthas.core.command.model.ExpressTypeEnum;
 import com.taobao.arthas.core.command.model.QLExpressConfigModel;
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 176f970f706..9217bd22398 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -2,7 +2,7 @@
 
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
-import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.qlexpress4.Express4Runner;
 import com.alibaba.qlexpress4.InitOptions;
 import com.alibaba.qlexpress4.QLOptions;

From b1a0379a2fff3e73efb77c5150aad49a65210ae5 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Tue, 8 Oct 2024 19:39:11 +0800
Subject: [PATCH 04/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/command/express/ExpressFactory.java       | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index a1bba017f00..32e5fe7999b 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -1,9 +1,7 @@
 package com.taobao.arthas.core.command.express;
 
-import com.alibaba.fastjson.JSON;
 import com.taobao.arthas.core.GlobalOptions;
 import com.taobao.arthas.core.command.model.ExpressTypeEnum;
-import com.taobao.arthas.core.command.model.QLExpressConfigModel;
 
 /**
  * ExpressFactory
@@ -42,16 +40,4 @@ public static Express unpooledExpressByOGNL(ClassLoader classloader) {
         }
         return new OgnlExpress(new ClassLoaderClassResolver(classloader));
     }
-
-    public static boolean checkQLExpressConfig(String configValue) {
-        try {
-            if ("".equals(configValue)) {
-                return true;
-            }
-            JSON.parseObject(configValue, QLExpressConfigModel.class);
-            return true;
-        }catch (Throwable t){
-            return false;
-        }
-    }
 }
\ No newline at end of file

From a878dc638522e82114411fa690eda6b6e3d47c55 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 27 Oct 2024 20:56:29 +0800
Subject: [PATCH 05/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/taobao/arthas/core/GlobalOptions.java |   2 +-
 .../core/command/express/QLExpress.java       |   2 +-
 site/yarn.lock                                | 267 ++++++++++++++++--
 3 files changed, 243 insertions(+), 28 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 6dc79ac3257..e242fa517ca 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -156,7 +156,7 @@ public class GlobalOptions {
      */
     @Option(level = 1,
             name = QLEXPRESS_CONFIG,
-            summary = "config init when use qlExpress, example: {\"\": \"\"} ",
+            summary = "config init when use qlExpress, example: {\"precise\": true }",
             description = ""
     )
     public static volatile String QLExpressConfig = "";
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 9217bd22398..176f970f706 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -2,7 +2,7 @@
 
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSON;
 import com.alibaba.qlexpress4.Express4Runner;
 import com.alibaba.qlexpress4.InitOptions;
 import com.alibaba.qlexpress4.QLOptions;
diff --git a/site/yarn.lock b/site/yarn.lock
index 678a41700fe..7fc4825848d 100644
--- a/site/yarn.lock
+++ b/site/yarn.lock
@@ -76,7 +76,7 @@
     "@algolia/requester-common" "4.14.2"
     "@algolia/transporter" "4.14.2"
 
-"@algolia/client-search@^4.9.1", "@algolia/client-search@4.14.2":
+"@algolia/client-search@4.14.2":
   version "4.14.2"
   resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz"
   integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==
@@ -130,7 +130,7 @@
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz"
   integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==
 
-"@docsearch/css@^3.2.1", "@docsearch/css@3.2.1":
+"@docsearch/css@3.2.1", "@docsearch/css@^3.2.1":
   version "3.2.1"
   resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz"
   integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==
@@ -143,7 +143,7 @@
     "@docsearch/react" "3.2.1"
     preact "^10.0.0"
 
-"@docsearch/react@^3.2.1", "@docsearch/react@3.2.1":
+"@docsearch/react@3.2.1", "@docsearch/react@^3.2.1":
   version "3.2.1"
   resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz"
   integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==
@@ -153,6 +153,16 @@
     "@docsearch/css" "3.2.1"
     algoliasearch "^4.0.0"
 
+"@esbuild/linux-loong64@0.14.54":
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
+  integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
+
+"@esbuild/linux-loong64@0.15.5":
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82"
+  integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==
+
 "@mdit-vue/plugin-component@^0.10.0":
   version "0.10.0"
   resolved "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.10.0.tgz"
@@ -210,7 +220,7 @@
     "@types/markdown-it" "^12.2.3"
     markdown-it "^13.0.1"
 
-"@mdit-vue/shared@^0.10.0", "@mdit-vue/shared@0.10.0":
+"@mdit-vue/shared@0.10.0", "@mdit-vue/shared@^0.10.0":
   version "0.10.0"
   resolved "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.10.0.tgz"
   integrity sha512-rUyu0NVNbaEg4DUiQenh/fam1MLdkItdzEVScN7vP0UzDWOwmGaKwkhlMmkSTW80H63ZlKst0fPe9LaGHImSZg==
@@ -219,7 +229,7 @@
     "@types/markdown-it" "^12.2.3"
     markdown-it "^13.0.1"
 
-"@mdit-vue/types@^0.10.0", "@mdit-vue/types@0.10.0":
+"@mdit-vue/types@0.10.0", "@mdit-vue/types@^0.10.0":
   version "0.10.0"
   resolved "https://registry.npmjs.org/@mdit-vue/types/-/types-0.10.0.tgz"
   integrity sha512-ROz5zVKt3COpuWUYFnpJh5kIXit9SQeMtimGBlwKJL1xEBNPG3QKD3VZzez5Ng/dBCApianCQhNVZGCza82Myw==
@@ -232,7 +242,7 @@
     "@nodelib/fs.stat" "2.0.5"
     run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
   version "2.0.5"
   resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -399,7 +409,7 @@
     "@vue/compiler-ssr" "3.2.38"
     "@vue/shared" "3.2.38"
 
-"@vue/shared@^3.2.37", "@vue/shared@3.2.38":
+"@vue/shared@3.2.38", "@vue/shared@^3.2.37":
   version "3.2.38"
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz"
   integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==
@@ -435,7 +445,7 @@
     envinfo "^7.8.1"
     esbuild "^0.15.5"
 
-"@vuepress/client@^2.0.0-beta.50", "@vuepress/client@2.0.0-beta.51":
+"@vuepress/client@2.0.0-beta.51":
   version "2.0.0-beta.51"
   resolved "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.51.tgz"
   integrity sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw==
@@ -478,7 +488,7 @@
     markdown-it-emoji "^2.0.2"
     mdurl "^1.0.1"
 
-"@vuepress/plugin-active-header-links@^2.0.0-beta.51", "@vuepress/plugin-active-header-links@2.0.0-beta.51":
+"@vuepress/plugin-active-header-links@2.0.0-beta.51", "@vuepress/plugin-active-header-links@^2.0.0-beta.51":
   version "2.0.0-beta.51"
   resolved "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.51.tgz"
   integrity sha512-AV9qLVSD3e9Xnp+2Vu9tegUdzbm9HD2bF6pRC3xEdW8GzRlsHBTfMpFwfsKvkKofk90+4ICkPWY9mY95P4mNSw==
@@ -590,7 +600,7 @@
     "@vuepress/core" "2.0.0-beta.51"
     prismjs "^1.28.0"
 
-"@vuepress/plugin-theme-data@^2.0.0-beta.51", "@vuepress/plugin-theme-data@2.0.0-beta.51":
+"@vuepress/plugin-theme-data@2.0.0-beta.51", "@vuepress/plugin-theme-data@^2.0.0-beta.51":
   version "2.0.0-beta.51"
   resolved "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.51.tgz"
   integrity sha512-sfsZRhb7zZATqY1+BXkynZZ7HEZnBZEd4iuEyCNpWEnjwa7/qjPSKJyAb/M0a2SLgN2/UcPdM5URMfE1mV/4QQ==
@@ -673,7 +683,7 @@
   dependencies:
     vue-demi "*"
 
-algoliasearch@^4.0.0, algoliasearch@^4.9.1:
+algoliasearch@^4.0.0:
   version "4.14.2"
   resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz"
   integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==
@@ -761,7 +771,7 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-browserslist@^4.21.3, "browserslist@>= 4.21.0":
+browserslist@^4.21.3:
   version "4.21.3"
   resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz"
   integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==
@@ -794,7 +804,7 @@ chalk@^5.0.0, chalk@^5.0.1:
   resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz"
   integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
 
-chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0":
+"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
   version "3.5.3"
   resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
   integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -891,6 +901,206 @@ envinfo@^7.8.1:
   resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz"
   integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
 
+esbuild-android-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
+  integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
+
+esbuild-android-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8"
+  integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==
+
+esbuild-android-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
+  integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
+
+esbuild-android-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193"
+  integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==
+
+esbuild-darwin-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
+  integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
+
+esbuild-darwin-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d"
+  integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==
+
+esbuild-darwin-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
+  integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
+
+esbuild-darwin-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997"
+  integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==
+
+esbuild-freebsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
+  integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
+
+esbuild-freebsd-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a"
+  integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==
+
+esbuild-freebsd-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
+  integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
+
+esbuild-freebsd-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd"
+  integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==
+
+esbuild-linux-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
+  integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
+
+esbuild-linux-32@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32"
+  integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==
+
+esbuild-linux-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
+  integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
+
+esbuild-linux-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9"
+  integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==
+
+esbuild-linux-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
+  integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
+
+esbuild-linux-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d"
+  integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==
+
+esbuild-linux-arm@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
+  integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
+
+esbuild-linux-arm@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5"
+  integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==
+
+esbuild-linux-mips64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
+  integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
+
+esbuild-linux-mips64le@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981"
+  integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==
+
+esbuild-linux-ppc64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
+  integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
+
+esbuild-linux-ppc64le@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474"
+  integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==
+
+esbuild-linux-riscv64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
+  integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
+
+esbuild-linux-riscv64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896"
+  integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==
+
+esbuild-linux-s390x@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
+  integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
+
+esbuild-linux-s390x@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae"
+  integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==
+
+esbuild-netbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
+  integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
+
+esbuild-netbsd-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8"
+  integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==
+
+esbuild-openbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
+  integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
+
+esbuild-openbsd-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035"
+  integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==
+
+esbuild-sunos-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
+  integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
+
+esbuild-sunos-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141"
+  integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==
+
+esbuild-windows-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
+  integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
+
+esbuild-windows-32@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7"
+  integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==
+
+esbuild-windows-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
+  integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
+
+esbuild-windows-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9"
+  integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==
+
+esbuild-windows-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
+  integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
+
+esbuild-windows-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b"
+  integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==
+
 esbuild@^0.14.47:
   version "0.14.54"
   resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz"
@@ -1036,6 +1246,11 @@ fs-extra@^10.1.0:
     jsonfile "^6.0.1"
     universalify "^2.0.0"
 
+fsevents@~2.3.2:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
 function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
@@ -1231,7 +1446,7 @@ markdown-it-emoji@^2.0.2:
   resolved "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz"
   integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==
 
-markdown-it@*, markdown-it@^13.0.1:
+markdown-it@^13.0.1:
   version "13.0.1"
   resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz"
   integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==
@@ -1390,7 +1605,7 @@ postcss-value-parser@^4.2.0:
   resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^8.1.0, postcss@^8.1.10, postcss@^8.4.16:
+postcss@^8.1.10, postcss@^8.4.16:
   version "8.4.16"
   resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz"
   integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
@@ -1457,13 +1672,6 @@ reusify@^1.0.4:
   resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rollup@^2.78.1:
-  version "2.78.1"
-  resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz"
-  integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==
-  optionalDependencies:
-    fsevents "~2.3.2"
-
 "rollup@>=2.75.6 <2.77.0 || ~2.77.0":
   version "2.77.3"
   resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz"
@@ -1471,6 +1679,13 @@ rollup@^2.78.1:
   optionalDependencies:
     fsevents "~2.3.2"
 
+rollup@^2.78.1:
+  version "2.78.1"
+  resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz"
+  integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
 run-parallel@^1.1.9:
   version "1.2.0"
   resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
@@ -1483,7 +1698,7 @@ safe-buffer@~5.2.0:
   resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
-sass@*, sass@^1.54.5, sass@^1.54.8:
+sass@^1.54.5, sass@^1.54.8:
   version "1.54.8"
   resolved "https://registry.npmjs.org/sass/-/sass-1.54.8.tgz"
   integrity sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww==
@@ -1527,7 +1742,7 @@ slash@^4.0.0:
   resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz"
   integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
 
-source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0":
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@@ -1616,7 +1831,7 @@ util-deprecate@^1.0.1:
   resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
   integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 
-vite@^3.0.0, vite@~3.0.9:
+vite@~3.0.9:
   version "3.0.9"
   resolved "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz"
   integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==
@@ -1645,7 +1860,7 @@ vue-router@^4.1.4, vue-router@^4.1.5:
   dependencies:
     "@vue/devtools-api" "^6.1.4"
 
-"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.37, vue@^3.2.38, vue@3.2.38:
+vue@^3.2.37, vue@^3.2.38:
   version "3.2.38"
   resolved "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz"
   integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==

From c780218b65b22eab23f8629a3bbe307d11086d4a Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 3 Nov 2024 21:17:13 +0800
Subject: [PATCH 06/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index e242fa517ca..24d3ab3a0aa 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -156,7 +156,7 @@ public class GlobalOptions {
      */
     @Option(level = 1,
             name = QLEXPRESS_CONFIG,
-            summary = "config init when use qlExpress, example: {\"precise\": true }",
+            summary = "config init when use qlExpress, with json-simple, for example: {\"precise\": true }",
             description = ""
     )
     public static volatile String QLExpressConfig = "";

From a54ac6548965b94b6637c77e809ca2ed9a6c4cc3 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 3 Nov 2024 21:40:25 +0800
Subject: [PATCH 07/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java  | 4 ++--
 .../com/taobao/arthas/core/command/model/ExpressTypeEnum.java | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 24d3ab3a0aa..29912fbd0d2 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -145,8 +145,8 @@ public class GlobalOptions {
      */
     @Option(level = 1,
             name = "express-type",
-            summary = "Option to use ognl/qlExpress",
-            description = "Option to use ognl/qlExpress in commands, default ognl"
+            summary = "Option to use ognl/qlexpress",
+            description = "Option to use ognl/qlexpress in commands, default ognl, can change to qlexpress"
     )
     public static volatile String ExpressType = "ognl";
 
diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java
index 1bc2b6ba36a..5191f875d04 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java
@@ -7,7 +7,7 @@
 public enum ExpressTypeEnum
 {
     OGNL("ognl"),
-    QLEXPRESS("QLExpress");
+    QLEXPRESS("qlexpress");
 
     private String expressType;
 

From cbdf590aff22c789e228f244eef2c5a653a26767 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 3 Nov 2024 21:48:21 +0800
Subject: [PATCH 08/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 29912fbd0d2..bc40cbefd53 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -156,7 +156,7 @@ public class GlobalOptions {
      */
     @Option(level = 1,
             name = QLEXPRESS_CONFIG,
-            summary = "config init when use qlExpress, with json-simple, for example: {\"precise\": true }",
+            summary = "config init when use qlexpress, with json-simple, for example: {\"precise\": true }",
             description = ""
     )
     public static volatile String QLExpressConfig = "";

From ec0f951dc098ca8917641462f1b2d96e2ecb2d64 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 10 Nov 2024 10:59:45 +0800
Subject: [PATCH 09/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../command/basic1000/OptionsCommand.java     |  1 +
 .../core/command/express/ExpressFactory.java  |  8 +++
 .../core/command/express/QLExpressTest.java   | 57 +++++++++++++++++++
 3 files changed, 66 insertions(+)
 create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java

diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java
index 14a0a6174ad..f134315f1b6 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java
@@ -71,6 +71,7 @@ public void setOptionValue(String optionValue) {
     @Override
     public void process(CommandProcess process) {
         try {
+            logger.info("start");
             ExitStatus status = null;
             if (isShow()) {
                 status = processShow(process);
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index 32e5fe7999b..112257b2454 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -1,14 +1,20 @@
 package com.taobao.arthas.core.command.express;
 
+import com.alibaba.arthas.deps.org.slf4j.Logger;
+import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 import com.taobao.arthas.core.GlobalOptions;
+import com.taobao.arthas.core.command.klass100.OgnlCommand;
 import com.taobao.arthas.core.command.model.ExpressTypeEnum;
 
+
 /**
  * ExpressFactory
  * @author ralf0131 2017-01-04 14:40.
  * @author hengyunabc 2018-10-08
  */
 public class ExpressFactory {
+    private static final Logger logger = LoggerFactory.getLogger(ExpressFactory.class);
+
     private static final ThreadLocal<Express> expressRef = ThreadLocal.withInitial(() -> new OgnlExpress());
     private static final ThreadLocal<Express> expressRefQLExpress = ThreadLocal.withInitial(() -> new QLExpress());
 
@@ -18,6 +24,7 @@ public class ExpressFactory {
      * @return
      */
     public static Express threadLocalExpress(Object object) {
+        logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType());
         if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) {
             return expressRefQLExpress.get().reset().bind(object);
         }
@@ -28,6 +35,7 @@ public static Express unpooledExpress(ClassLoader classloader) {
         if (classloader == null) {
             classloader = ClassLoader.getSystemClassLoader();
         }
+        logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType());
         if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) {
             return new QLExpress(classloader);
         }
diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java
new file mode 100644
index 00000000000..6341242ac25
--- /dev/null
+++ b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java
@@ -0,0 +1,57 @@
+package com.taobao.arthas.core.command.express;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/10/7 9:21 PM
+ */
+public class QLExpressTest {
+
+    @Test
+    public void testValidQLExpr1() throws ExpressException {
+        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
+        Assert.assertEquals(unpooledExpress.get("\"test\".length() % 2 == 0 ? \"even length\" : \"odd length\""),
+                "even length");
+    }
+
+    @Test
+    public void testValidQLExpr2() throws ExpressException {
+        System.setProperty("ognl.chain.short-circuit", String.valueOf(false));
+        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
+        Assert.assertEquals(unpooledExpress.get("4 in {1, 2, 3, 4}"), true);
+        Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{^ #this % 2 == 0}[$]"), 2);
+        Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{? #this % 2 == 0}[$]"), 4);
+    }
+
+    @Test
+    public void testValidQLExpr3() throws ExpressException {
+        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
+        Assert.assertEquals(unpooledExpress.get("#factorial = :[#this <= 1 ? 1 : #this * #factorial(#this - 1)], #factorial(5)"),
+                120);
+    }
+
+    @Test
+    public void testValidQLExpr4() throws ExpressException {
+        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
+        System.setProperty("arthas.test1", "arthas");
+        System.setProperty("arthas.ognl.test2", "test");
+        Assert.assertEquals(unpooledExpress.get("#value1=@System@getProperty(\"arthas.test1\")," +
+                        "#value2=@System@getProperty(\"arthas.ognl.test2\"), {#value1, #value2}").toString(),
+                "[arthas, test]");
+        System.clearProperty("arthas.test1");
+        System.clearProperty("arthas.ognl.test2");
+    }
+
+    @Test
+    public void testInvalidQLExpr() {
+        try {
+            Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
+            System.out.println(unpooledExpress.get("#value1=@System.getProperty(\"java.home\")," +
+                    "#value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}").toString());
+        } catch (Exception e){
+            Assert.assertTrue(e.getCause() instanceof ognl.ExpressionSyntaxException);
+        }
+    }
+}

From 2dab795545393215ad337e3dcaae6affc40aa5fa Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 10 Nov 2024 11:10:53 +0800
Subject: [PATCH 10/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../taobao/arthas/core/command/express/ExpressFactory.java  | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index 112257b2454..bb1757c7523 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -24,8 +24,7 @@ public class ExpressFactory {
      * @return
      */
     public static Express threadLocalExpress(Object object) {
-        logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType());
-        if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) {
+        if (GlobalOptions.ExpressType.equals(ExpressTypeEnum.QLEXPRESS.getExpressType())) {
             return expressRefQLExpress.get().reset().bind(object);
         }
         return expressRef.get().reset().bind(object);
@@ -35,8 +34,7 @@ public static Express unpooledExpress(ClassLoader classloader) {
         if (classloader == null) {
             classloader = ClassLoader.getSystemClassLoader();
         }
-        logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType());
-        if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) {
+        if (GlobalOptions.ExpressType.equals(ExpressTypeEnum.QLEXPRESS.getExpressType())) {
             return new QLExpress(classloader);
         }
         return new OgnlExpress(new ClassLoaderClassResolver(classloader));

From 44fde5c4ea16dfa5814ba4f7b1ab03ba41cbbbe7 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 10 Nov 2024 11:33:47 +0800
Subject: [PATCH 11/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../command/basic1000/OptionsCommand.java     |  1 -
 .../core/command/express/QLExpress.java       | 25 +++++++++++--------
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java
index f134315f1b6..14a0a6174ad 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java
@@ -71,7 +71,6 @@ public void setOptionValue(String optionValue) {
     @Override
     public void process(CommandProcess process) {
         try {
-            logger.info("start");
             ExitStatus status = null;
             if (isShow()) {
                 status = processShow(process);
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 176f970f706..9e4076bf9c5 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -28,27 +28,29 @@ public class QLExpress implements Express {
 
     public QLExpress() {
         initQLExpress();
-        initConfig(null);
+        initConfig();
         initContext();
     }
 
     public QLExpress(ClassLoader classloader) {
         initQLExpress();
-        initConfig(classloader);
+        initConfig();
         initContext();
     }
 
-    private void initConfig(ClassLoader classloader) {
+    private void initConfig() {
         try {
-            QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class);
-            this.qlExpressConfigModel = qlExpressConfigModel;
             QLOptions.Builder qlOptionsBuilder = QLOptions.builder();
-            qlOptionsBuilder.cache(qlExpressConfigModel.isCache());
-            qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer());
-            qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength());
-            qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext());
-            qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise());
-            qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis());
+            if (GlobalOptions.QLExpressConfig.length() > 0) {
+                QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class);
+                this.qlExpressConfigModel = qlExpressConfigModel;
+                qlOptionsBuilder.cache(qlExpressConfigModel.isCache());
+                qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer());
+                qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength());
+                qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext());
+                qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise());
+                qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis());
+            }
             qlOptions = qlOptionsBuilder.build();
 
             InitOptions.Builder initOptionsBuilder = InitOptions.builder();
@@ -74,6 +76,7 @@ private void initContext() {
     @Override
     public Object get(String express) throws ExpressException {
         try {
+            logger.info("exp:"+express+ " "+ JSON.toJSONString(qlGlobalContext) + " "+JSON.toJSONString(qlOptions));
             Object result = expressRunner.execute(express, qlGlobalContext, qlOptions);
             return result;
         } catch (Exception e) {

From aebe3024bb7d16b717e2f20fc40998983768ad6f Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 10 Nov 2024 11:35:41 +0800
Subject: [PATCH 12/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/taobao/arthas/core/command/express/QLExpress.java   | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 9e4076bf9c5..81f7f48a9b3 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -58,6 +58,7 @@ private void initConfig() {
             initOptionsBuilder.debug(qlExpressConfigModel.isDebug());
             initOptionsBuilder.useCacheClear(qlExpressConfigModel.isUseCacheClear());
             initOptions = initOptionsBuilder.build();
+
             //4.0设置InitOptions
         }catch (Throwable t){
             //异常不设置options

From 7d73a17fd0d2cb27f168982e3033bc4a3076a537 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 10 Nov 2024 11:42:54 +0800
Subject: [PATCH 13/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/taobao/arthas/core/command/express/QLExpress.java  | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 81f7f48a9b3..2d289917da4 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -43,7 +43,6 @@ private void initConfig() {
             QLOptions.Builder qlOptionsBuilder = QLOptions.builder();
             if (GlobalOptions.QLExpressConfig.length() > 0) {
                 QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class);
-                this.qlExpressConfigModel = qlExpressConfigModel;
                 qlOptionsBuilder.cache(qlExpressConfigModel.isCache());
                 qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer());
                 qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength());
@@ -53,12 +52,6 @@ private void initConfig() {
             }
             qlOptions = qlOptionsBuilder.build();
 
-            InitOptions.Builder initOptionsBuilder = InitOptions.builder();
-            initOptionsBuilder.allowPrivateAccess(qlExpressConfigModel.isAllowPrivateAccess());
-            initOptionsBuilder.debug(qlExpressConfigModel.isDebug());
-            initOptionsBuilder.useCacheClear(qlExpressConfigModel.isUseCacheClear());
-            initOptions = initOptionsBuilder.build();
-
             //4.0设置InitOptions
         }catch (Throwable t){
             //异常不设置options

From 49d9397e1d9461ce3df853a3e1b65490d9692ce8 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 1 Dec 2024 19:19:45 +0800
Subject: [PATCH 14/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/command/express/ExpressFactory.java  |  2 +-
 .../core/command/express/OgnlExpress.java     |  4 ++
 .../core/command/express/QLExpress.java       | 40 +++++++++------
 .../QLExpressClassLoaderClassResolver.java    | 47 ++++++++++++++++++
 .../express/QLExpressCustomClassResolver.java | 49 +++++++++++++++++++
 .../core/command/express/QLExpressRunner.java |  8 +--
 .../core/command/express/QLGlobalContext.java | 39 ++++++++++++---
 7 files changed, 161 insertions(+), 28 deletions(-)
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java
 create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index bb1757c7523..714323e2a0c 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -35,7 +35,7 @@ public static Express unpooledExpress(ClassLoader classloader) {
             classloader = ClassLoader.getSystemClassLoader();
         }
         if (GlobalOptions.ExpressType.equals(ExpressTypeEnum.QLEXPRESS.getExpressType())) {
-            return new QLExpress(classloader);
+            return new QLExpress(new QLExpressClassLoaderClassResolver(classloader));
         }
         return new OgnlExpress(new ClassLoaderClassResolver(classloader));
     }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java
index f29bd31d254..fdc1d58bd19 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java
@@ -3,6 +3,7 @@
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 
+import com.alibaba.fastjson2.JSON;
 import ognl.ClassResolver;
 import ognl.MemberAccess;
 import ognl.Ognl;
@@ -33,6 +34,9 @@ public OgnlExpress(ClassResolver classResolver) {
     @Override
     public Object get(String express) throws ExpressException {
         try {
+            logger.info("Ognl exp:"+express);
+            logger.info("Ognl context:"+context);
+            logger.info("Ognl bindObject:"+JSON.toJSONString(bindObject));
             return Ognl.getValue(express, context, bindObject);
         } catch (Exception e) {
             logger.error("Error during evaluating the expression:", e);
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 2d289917da4..8777832c074 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -3,9 +3,12 @@
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.qlexpress4.ClassSupplier;
 import com.alibaba.qlexpress4.Express4Runner;
 import com.alibaba.qlexpress4.InitOptions;
 import com.alibaba.qlexpress4.QLOptions;
+import com.alibaba.qlexpress4.runtime.ReflectLoader;
+import com.alibaba.qlexpress4.security.QLSecurityStrategy;
 import com.taobao.arthas.core.GlobalOptions;
 import com.taobao.arthas.core.command.model.QLExpressConfigModel;
 
@@ -18,30 +21,25 @@ public class QLExpress implements Express {
     private static final Logger logger = LoggerFactory.getLogger(QLExpress.class);
     private Express4Runner expressRunner;
     private QLGlobalContext qlGlobalContext;
-    private Object runResult;
-
-    private QLExpressConfigModel qlExpressConfigModel;
 
     private QLOptions qlOptions;
 
     private InitOptions initOptions;
 
     public QLExpress() {
-        initQLExpress();
-        initConfig();
-        initContext();
+        this(QLExpressCustomClassResolver.customClassResolver);
     }
 
-    public QLExpress(ClassLoader classloader) {
-        initQLExpress();
+    public QLExpress(ClassSupplier classResolver) {
+        initQLExpress(classResolver);
         initConfig();
         initContext();
     }
 
     private void initConfig() {
         try {
-            QLOptions.Builder qlOptionsBuilder = QLOptions.builder();
             if (GlobalOptions.QLExpressConfig.length() > 0) {
+                QLOptions.Builder qlOptionsBuilder = QLOptions.builder();
                 QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class);
                 qlOptionsBuilder.cache(qlExpressConfigModel.isCache());
                 qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer());
@@ -49,9 +47,10 @@ private void initConfig() {
                 qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext());
                 qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise());
                 qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis());
+                qlOptions = qlOptionsBuilder.build();
+            }else {
+                qlOptions = QLOptions.DEFAULT_OPTIONS;
             }
-            qlOptions = qlOptionsBuilder.build();
-
             //4.0设置InitOptions
         }catch (Throwable t){
             //异常不设置options
@@ -59,19 +58,27 @@ private void initConfig() {
         }
     }
 
-    private void initQLExpress() {
-        expressRunner = QLExpressRunner.getInstance();
+    private void initQLExpress(ClassSupplier classResolver) {
+        InitOptions.Builder initOptionsBuilder = InitOptions.builder();
+        initOptionsBuilder.securityStrategy(QLSecurityStrategy.open());
+        initOptionsBuilder.allowPrivateAccess(true);
+        initOptionsBuilder.classSupplier(classResolver);
+        initOptions = initOptionsBuilder.build();
+        expressRunner = QLExpressRunner.getInstance(initOptions);
     }
 
     private void initContext() {
-        qlGlobalContext = new QLGlobalContext();
+        ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.allowPrivateAccess());
+        qlGlobalContext = new QLGlobalContext(reflectLoader);
     }
 
     @Override
     public Object get(String express) throws ExpressException {
         try {
-            logger.info("exp:"+express+ " "+ JSON.toJSONString(qlGlobalContext) + " "+JSON.toJSONString(qlOptions));
+            logger.info("exp:"+express);
+            qlGlobalContext.getContext().forEach((key, value) -> logger.info("qlGlobalContext:"+key + " type:"+value.getClass().getName() + " value:"+JSON.toJSONString(value)));
             Object result = expressRunner.execute(express, qlGlobalContext, qlOptions);
+            logger.info("res:"+JSON.toJSONString(result));
             return result;
         } catch (Exception e) {
             logger.error("Error during evaluating the expression with QLExpress:", e);
@@ -87,18 +94,21 @@ public boolean is(String express) throws ExpressException {
 
     @Override
     public Express bind(Object object) {
+        logger.info("bind object:"+ JSON.toJSONString(object));
         qlGlobalContext.bindObj(object);
         return this;
     }
 
     @Override
     public Express bind(String name, Object value) {
+        logger.info("bind String name, Object value:"+name+ " "+ JSON.toJSONString(value));
         qlGlobalContext.put(name, value);
         return this;
     }
 
     @Override
     public Express reset() {
+        logger.info("bind reset");
         qlGlobalContext.clear();
         return this;
     }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java
new file mode 100644
index 00000000000..19e4a88e121
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java
@@ -0,0 +1,47 @@
+package com.taobao.arthas.core.command.express;
+
+import com.alibaba.qlexpress4.ClassSupplier;
+import ognl.OgnlContext;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/12/1 7:07 PM
+ */
+public class QLExpressClassLoaderClassResolver implements ClassSupplier {
+
+    private ClassLoader classLoader;
+
+    private Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>(101);
+
+    public QLExpressClassLoaderClassResolver(ClassLoader classLoader) {
+        this.classLoader = classLoader;
+    }
+
+    @Override
+    public Class<?> loadCls(String className) {
+        Class<?> result = null;
+
+        if ((result = classes.get(className)) == null) {
+            try {
+                result = classLoader.loadClass(className);
+            } catch (ClassNotFoundException ex) {
+                if (className.indexOf('.') == -1) {
+                    try {
+                        result = Class.forName("java.lang." + className);
+                    } catch (ClassNotFoundException e) {
+                        throw new RuntimeException(e);
+                    }
+                    classes.put("java.lang." + className, result);
+                }
+            }
+            if (result == null) {
+                return null;
+            }
+            classes.put(className, result);
+        }
+        return result;
+    }
+}
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java
new file mode 100644
index 00000000000..7e2f4683297
--- /dev/null
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java
@@ -0,0 +1,49 @@
+package com.taobao.arthas.core.command.express;
+
+import com.alibaba.qlexpress4.ClassSupplier;
+import ognl.OgnlContext;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author TaoKan
+ * @Date 2024/12/1 7:06 PM
+ */
+public class QLExpressCustomClassResolver implements ClassSupplier {
+
+    public static final QLExpressCustomClassResolver customClassResolver = new QLExpressCustomClassResolver();
+
+    private Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>(101);
+
+    private QLExpressCustomClassResolver() {
+
+    }
+
+    @Override
+    public Class<?> loadCls(String className) {
+        Class<?> result = null;
+
+        if ((result = classes.get(className)) == null) {
+            try {
+                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+                if (classLoader != null) {
+                    result = classLoader.loadClass(className);
+                } else {
+                    result = Class.forName(className);
+                }
+            } catch (ClassNotFoundException ex) {
+                if (className.indexOf('.') == -1) {
+                    try {
+                        result = Class.forName("java.lang." + className);
+                    } catch (ClassNotFoundException e) {
+                        throw new RuntimeException(e);
+                    }
+                    classes.put("java.lang." + className, result);
+                }
+            }
+            classes.put(className, result);
+        }
+        return result;
+    }
+}
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java
index 2c6cfee71f6..c9c18f603b8 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java
@@ -12,18 +12,18 @@ public class QLExpressRunner {
     private volatile static QLExpressRunner instance = null;
     private Express4Runner expressRunner;
 
-    private QLExpressRunner(){
-        expressRunner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
+    private QLExpressRunner(InitOptions initOptions){
+        expressRunner = new Express4Runner(initOptions);
     }
 
     //对外提供静态方法获取对象
-    public static Express4Runner getInstance(){
+    public static Express4Runner getInstance(InitOptions initOptions){
         //第一次判断,如果instance不为null,不进入抢锁阶段,直接返回实例
         if(instance == null){
             synchronized (QLExpressRunner.class){
                 //抢到锁之后再次进行判断是否为null
                 if(instance == null){
-                    instance = new QLExpressRunner();
+                    instance = new QLExpressRunner(initOptions);
                 }
             }
         }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
index 1a510178a4b..e8be2bca59d 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
@@ -1,5 +1,8 @@
 package com.taobao.arthas.core.command.express;
 
+import com.alibaba.arthas.deps.org.slf4j.Logger;
+import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
+import com.alibaba.fastjson2.JSON;
 import com.alibaba.qlexpress4.exception.PureErrReporter;
 import com.alibaba.qlexpress4.runtime.ReflectLoader;
 import com.alibaba.qlexpress4.runtime.Value;
@@ -14,18 +17,15 @@
  * @Date 2024/9/22 12:39 PM
  */
 public class QLGlobalContext implements ExpressContext {
+    private static final Logger logger = LoggerFactory.getLogger(QLGlobalContext.class);
+
     private Map<String, Object> context;
     private Object object;
     private ReflectLoader reflectLoader;
 
-    public QLGlobalContext(Map<String, Object> context, Object bindObject, ReflectLoader reflectLoader) {
-        this.context = context;
-        this.object = bindObject;
-        this.reflectLoader = reflectLoader;
-    }
-
-    public QLGlobalContext() {
+    public QLGlobalContext(ReflectLoader reflectLoader) {
         this.context = new ConcurrentHashMap<>();
+        this.reflectLoader = reflectLoader;
     }
 
     public void put(String name, Object value){
@@ -34,16 +34,39 @@ public void put(String name, Object value){
 
     public void clear() {
         context.clear();
+        this.context.put("reflectLoader",reflectLoader);
     }
 
     public void bindObj(Object object) {
         this.object = object;
+        context.put("object",object);
     }
     @Override
     public Value get(Map<String, Object> attachments, String variableName) {
+        logger.info("get variableName:"+variableName+ " "+ (this.object != null) + " "+(this.reflectLoader != null));
+
         if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) {
             return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE);
         }
-        return new MapItemValue(this.context, variableName);
+        String newVariableName = variableName.replace("#","");
+        return new MapItemValue(this.context, newVariableName);
+    }
+
+
+    public Map<String, Object> getContext() {
+        return context;
     }
+
+    public void setContext(Map<String, Object> context) {
+        this.context = context;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+
+    public void setObject(Object object) {
+        this.object = object;
+    }
+
 }

From 87b71d072dda389885978aea192ca03a9340ec07 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 22 Dec 2024 17:47:32 +0800
Subject: [PATCH 15/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/command/express/ExpressFactory.java  |  4 --
 .../core/command/express/OgnlExpress.java     |  4 --
 .../core/command/express/QLExpress.java       |  8 +---
 .../QLExpressClassLoaderClassResolver.java    | 41 +++++++---------
 .../express/QLExpressCustomClassResolver.java | 47 +++++++++----------
 .../core/command/express/QLGlobalContext.java |  2 -
 pom.xml                                       |  2 +-
 7 files changed, 40 insertions(+), 68 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
index 714323e2a0c..207f7aac848 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java
@@ -1,9 +1,6 @@
 package com.taobao.arthas.core.command.express;
 
-import com.alibaba.arthas.deps.org.slf4j.Logger;
-import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 import com.taobao.arthas.core.GlobalOptions;
-import com.taobao.arthas.core.command.klass100.OgnlCommand;
 import com.taobao.arthas.core.command.model.ExpressTypeEnum;
 
 
@@ -13,7 +10,6 @@
  * @author hengyunabc 2018-10-08
  */
 public class ExpressFactory {
-    private static final Logger logger = LoggerFactory.getLogger(ExpressFactory.class);
 
     private static final ThreadLocal<Express> expressRef = ThreadLocal.withInitial(() -> new OgnlExpress());
     private static final ThreadLocal<Express> expressRefQLExpress = ThreadLocal.withInitial(() -> new QLExpress());
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java
index fdc1d58bd19..f29bd31d254 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java
@@ -3,7 +3,6 @@
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 
-import com.alibaba.fastjson2.JSON;
 import ognl.ClassResolver;
 import ognl.MemberAccess;
 import ognl.Ognl;
@@ -34,9 +33,6 @@ public OgnlExpress(ClassResolver classResolver) {
     @Override
     public Object get(String express) throws ExpressException {
         try {
-            logger.info("Ognl exp:"+express);
-            logger.info("Ognl context:"+context);
-            logger.info("Ognl bindObject:"+JSON.toJSONString(bindObject));
             return Ognl.getValue(express, context, bindObject);
         } catch (Exception e) {
             logger.error("Error during evaluating the expression:", e);
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 8777832c074..5c4da297397 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -68,17 +68,14 @@ private void initQLExpress(ClassSupplier classResolver) {
     }
 
     private void initContext() {
-        ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.allowPrivateAccess());
+        ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.isAllowPrivateAccess());
         qlGlobalContext = new QLGlobalContext(reflectLoader);
     }
 
     @Override
     public Object get(String express) throws ExpressException {
         try {
-            logger.info("exp:"+express);
-            qlGlobalContext.getContext().forEach((key, value) -> logger.info("qlGlobalContext:"+key + " type:"+value.getClass().getName() + " value:"+JSON.toJSONString(value)));
             Object result = expressRunner.execute(express, qlGlobalContext, qlOptions);
-            logger.info("res:"+JSON.toJSONString(result));
             return result;
         } catch (Exception e) {
             logger.error("Error during evaluating the expression with QLExpress:", e);
@@ -94,21 +91,18 @@ public boolean is(String express) throws ExpressException {
 
     @Override
     public Express bind(Object object) {
-        logger.info("bind object:"+ JSON.toJSONString(object));
         qlGlobalContext.bindObj(object);
         return this;
     }
 
     @Override
     public Express bind(String name, Object value) {
-        logger.info("bind String name, Object value:"+name+ " "+ JSON.toJSONString(value));
         qlGlobalContext.put(name, value);
         return this;
     }
 
     @Override
     public Express reset() {
-        logger.info("bind reset");
         qlGlobalContext.clear();
         return this;
     }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java
index 19e4a88e121..70a469c3b63 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java
@@ -1,9 +1,8 @@
 package com.taobao.arthas.core.command.express;
 
 import com.alibaba.qlexpress4.ClassSupplier;
-import ognl.OgnlContext;
-
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -14,34 +13,28 @@ public class QLExpressClassLoaderClassResolver implements ClassSupplier {
 
     private ClassLoader classLoader;
 
-    private Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>(101);
+    private final Map<String, Optional<Class<?>>> cache = new ConcurrentHashMap<>();
 
     public QLExpressClassLoaderClassResolver(ClassLoader classLoader) {
         this.classLoader = classLoader;
     }
 
-    @Override
-    public Class<?> loadCls(String className) {
-        Class<?> result = null;
-
-        if ((result = classes.get(className)) == null) {
-            try {
-                result = classLoader.loadClass(className);
-            } catch (ClassNotFoundException ex) {
-                if (className.indexOf('.') == -1) {
-                    try {
-                        result = Class.forName("java.lang." + className);
-                    } catch (ClassNotFoundException e) {
-                        throw new RuntimeException(e);
-                    }
-                    classes.put("java.lang." + className, result);
-                }
+    private Optional<Class<?>> loadClsInner(String clsQualifiedName) {
+        try {
+            Class<?> aClass = null;
+            if (classLoader != null) {
+                aClass = classLoader.loadClass(clsQualifiedName);
+            }else {
+                aClass = Class.forName(clsQualifiedName);
             }
-            if (result == null) {
-                return null;
-            }
-            classes.put(className, result);
+            return Optional.of(aClass);
+        } catch (ClassNotFoundException | NoClassDefFoundError e) {
+            return Optional.empty();
         }
-        return result;
+    }
+    @Override
+    public Class<?> loadCls(String className) {
+        Optional<Class<?>> clsOp = cache.computeIfAbsent(className, this::loadClsInner);
+        return clsOp.orElse(null);
     }
 }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java
index 7e2f4683297..9c127fe50e4 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java
@@ -1,9 +1,10 @@
 package com.taobao.arthas.core.command.express;
 
+import com.alibaba.arthas.deps.org.slf4j.Logger;
+import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 import com.alibaba.qlexpress4.ClassSupplier;
-import ognl.OgnlContext;
-
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -14,36 +15,30 @@ public class QLExpressCustomClassResolver implements ClassSupplier {
 
     public static final QLExpressCustomClassResolver customClassResolver = new QLExpressCustomClassResolver();
 
-    private Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>(101);
+    private final Map<String, Optional<Class<?>>> cache = new ConcurrentHashMap<>();
 
     private QLExpressCustomClassResolver() {
 
     }
 
-    @Override
-    public Class<?> loadCls(String className) {
-        Class<?> result = null;
-
-        if ((result = classes.get(className)) == null) {
-            try {
-                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-                if (classLoader != null) {
-                    result = classLoader.loadClass(className);
-                } else {
-                    result = Class.forName(className);
-                }
-            } catch (ClassNotFoundException ex) {
-                if (className.indexOf('.') == -1) {
-                    try {
-                        result = Class.forName("java.lang." + className);
-                    } catch (ClassNotFoundException e) {
-                        throw new RuntimeException(e);
-                    }
-                    classes.put("java.lang." + className, result);
-                }
+    private Optional<Class<?>> loadClsInner(String clsQualifiedName) {
+        try {
+            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+            Class<?> aClass = null;
+            if (classLoader != null) {
+                aClass = classLoader.loadClass(clsQualifiedName);
+            } else {
+                aClass = Class.forName(clsQualifiedName);
             }
-            classes.put(className, result);
+            return Optional.of(aClass);
+        } catch (ClassNotFoundException | NoClassDefFoundError e) {
+            return Optional.empty();
         }
-        return result;
     }
+    @Override
+    public Class<?> loadCls(String clsQualifiedName) {
+        Optional<Class<?>> clsOp = cache.computeIfAbsent(clsQualifiedName, this::loadClsInner);
+        return clsOp.orElse(null);
+    }
+
 }
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
index e8be2bca59d..fa6e46f9054 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
@@ -43,8 +43,6 @@ public void bindObj(Object object) {
     }
     @Override
     public Value get(Map<String, Object> attachments, String variableName) {
-        logger.info("get variableName:"+variableName+ " "+ (this.object != null) + " "+(this.reflectLoader != null));
-
         if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) {
             return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE);
         }
diff --git a/pom.xml b/pom.xml
index 0bff6526a3d..4133dd1aa53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,7 +161,7 @@
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>QLExpress4</artifactId>
-                <version>4.0.0-beta</version>
+                <version>4.0.0-beta.1</version>
             </dependency>
             <dependency>
                 <groupId>org.junit</groupId>

From 35899a8f1753154bb696845d3fbfca796122ecbe Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 22 Dec 2024 18:08:00 +0800
Subject: [PATCH 16/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/command/express/QLExpressTest.java   | 57 -------------------
 1 file changed, 57 deletions(-)
 delete mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java

diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java
deleted file mode 100644
index 6341242ac25..00000000000
--- a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.taobao.arthas.core.command.express;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * @Author TaoKan
- * @Date 2024/10/7 9:21 PM
- */
-public class QLExpressTest {
-
-    @Test
-    public void testValidQLExpr1() throws ExpressException {
-        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
-        Assert.assertEquals(unpooledExpress.get("\"test\".length() % 2 == 0 ? \"even length\" : \"odd length\""),
-                "even length");
-    }
-
-    @Test
-    public void testValidQLExpr2() throws ExpressException {
-        System.setProperty("ognl.chain.short-circuit", String.valueOf(false));
-        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
-        Assert.assertEquals(unpooledExpress.get("4 in {1, 2, 3, 4}"), true);
-        Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{^ #this % 2 == 0}[$]"), 2);
-        Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{? #this % 2 == 0}[$]"), 4);
-    }
-
-    @Test
-    public void testValidQLExpr3() throws ExpressException {
-        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
-        Assert.assertEquals(unpooledExpress.get("#factorial = :[#this <= 1 ? 1 : #this * #factorial(#this - 1)], #factorial(5)"),
-                120);
-    }
-
-    @Test
-    public void testValidQLExpr4() throws ExpressException {
-        Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
-        System.setProperty("arthas.test1", "arthas");
-        System.setProperty("arthas.ognl.test2", "test");
-        Assert.assertEquals(unpooledExpress.get("#value1=@System@getProperty(\"arthas.test1\")," +
-                        "#value2=@System@getProperty(\"arthas.ognl.test2\"), {#value1, #value2}").toString(),
-                "[arthas, test]");
-        System.clearProperty("arthas.test1");
-        System.clearProperty("arthas.ognl.test2");
-    }
-
-    @Test
-    public void testInvalidQLExpr() {
-        try {
-            Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader());
-            System.out.println(unpooledExpress.get("#value1=@System.getProperty(\"java.home\")," +
-                    "#value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}").toString());
-        } catch (Exception e){
-            Assert.assertTrue(e.getCause() instanceof ognl.ExpressionSyntaxException);
-        }
-    }
-}

From 5a77e9329266c7894b81ec7bc57142cbf8f19278 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 22 Dec 2024 18:12:14 +0800
Subject: [PATCH 17/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91yarn=20revert?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 site/yarn.lock | 267 +++++--------------------------------------------
 1 file changed, 26 insertions(+), 241 deletions(-)

diff --git a/site/yarn.lock b/site/yarn.lock
index 7fc4825848d..678a41700fe 100644
--- a/site/yarn.lock
+++ b/site/yarn.lock
@@ -76,7 +76,7 @@
     "@algolia/requester-common" "4.14.2"
     "@algolia/transporter" "4.14.2"
 
-"@algolia/client-search@4.14.2":
+"@algolia/client-search@^4.9.1", "@algolia/client-search@4.14.2":
   version "4.14.2"
   resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz"
   integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==
@@ -130,7 +130,7 @@
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz"
   integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==
 
-"@docsearch/css@3.2.1", "@docsearch/css@^3.2.1":
+"@docsearch/css@^3.2.1", "@docsearch/css@3.2.1":
   version "3.2.1"
   resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz"
   integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==
@@ -143,7 +143,7 @@
     "@docsearch/react" "3.2.1"
     preact "^10.0.0"
 
-"@docsearch/react@3.2.1", "@docsearch/react@^3.2.1":
+"@docsearch/react@^3.2.1", "@docsearch/react@3.2.1":
   version "3.2.1"
   resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz"
   integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==
@@ -153,16 +153,6 @@
     "@docsearch/css" "3.2.1"
     algoliasearch "^4.0.0"
 
-"@esbuild/linux-loong64@0.14.54":
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
-  integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
-
-"@esbuild/linux-loong64@0.15.5":
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82"
-  integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==
-
 "@mdit-vue/plugin-component@^0.10.0":
   version "0.10.0"
   resolved "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.10.0.tgz"
@@ -220,7 +210,7 @@
     "@types/markdown-it" "^12.2.3"
     markdown-it "^13.0.1"
 
-"@mdit-vue/shared@0.10.0", "@mdit-vue/shared@^0.10.0":
+"@mdit-vue/shared@^0.10.0", "@mdit-vue/shared@0.10.0":
   version "0.10.0"
   resolved "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.10.0.tgz"
   integrity sha512-rUyu0NVNbaEg4DUiQenh/fam1MLdkItdzEVScN7vP0UzDWOwmGaKwkhlMmkSTW80H63ZlKst0fPe9LaGHImSZg==
@@ -229,7 +219,7 @@
     "@types/markdown-it" "^12.2.3"
     markdown-it "^13.0.1"
 
-"@mdit-vue/types@0.10.0", "@mdit-vue/types@^0.10.0":
+"@mdit-vue/types@^0.10.0", "@mdit-vue/types@0.10.0":
   version "0.10.0"
   resolved "https://registry.npmjs.org/@mdit-vue/types/-/types-0.10.0.tgz"
   integrity sha512-ROz5zVKt3COpuWUYFnpJh5kIXit9SQeMtimGBlwKJL1xEBNPG3QKD3VZzez5Ng/dBCApianCQhNVZGCza82Myw==
@@ -242,7 +232,7 @@
     "@nodelib/fs.stat" "2.0.5"
     run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
   version "2.0.5"
   resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -409,7 +399,7 @@
     "@vue/compiler-ssr" "3.2.38"
     "@vue/shared" "3.2.38"
 
-"@vue/shared@3.2.38", "@vue/shared@^3.2.37":
+"@vue/shared@^3.2.37", "@vue/shared@3.2.38":
   version "3.2.38"
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz"
   integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==
@@ -445,7 +435,7 @@
     envinfo "^7.8.1"
     esbuild "^0.15.5"
 
-"@vuepress/client@2.0.0-beta.51":
+"@vuepress/client@^2.0.0-beta.50", "@vuepress/client@2.0.0-beta.51":
   version "2.0.0-beta.51"
   resolved "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.51.tgz"
   integrity sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw==
@@ -488,7 +478,7 @@
     markdown-it-emoji "^2.0.2"
     mdurl "^1.0.1"
 
-"@vuepress/plugin-active-header-links@2.0.0-beta.51", "@vuepress/plugin-active-header-links@^2.0.0-beta.51":
+"@vuepress/plugin-active-header-links@^2.0.0-beta.51", "@vuepress/plugin-active-header-links@2.0.0-beta.51":
   version "2.0.0-beta.51"
   resolved "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.51.tgz"
   integrity sha512-AV9qLVSD3e9Xnp+2Vu9tegUdzbm9HD2bF6pRC3xEdW8GzRlsHBTfMpFwfsKvkKofk90+4ICkPWY9mY95P4mNSw==
@@ -600,7 +590,7 @@
     "@vuepress/core" "2.0.0-beta.51"
     prismjs "^1.28.0"
 
-"@vuepress/plugin-theme-data@2.0.0-beta.51", "@vuepress/plugin-theme-data@^2.0.0-beta.51":
+"@vuepress/plugin-theme-data@^2.0.0-beta.51", "@vuepress/plugin-theme-data@2.0.0-beta.51":
   version "2.0.0-beta.51"
   resolved "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.51.tgz"
   integrity sha512-sfsZRhb7zZATqY1+BXkynZZ7HEZnBZEd4iuEyCNpWEnjwa7/qjPSKJyAb/M0a2SLgN2/UcPdM5URMfE1mV/4QQ==
@@ -683,7 +673,7 @@
   dependencies:
     vue-demi "*"
 
-algoliasearch@^4.0.0:
+algoliasearch@^4.0.0, algoliasearch@^4.9.1:
   version "4.14.2"
   resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz"
   integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==
@@ -771,7 +761,7 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-browserslist@^4.21.3:
+browserslist@^4.21.3, "browserslist@>= 4.21.0":
   version "4.21.3"
   resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz"
   integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==
@@ -804,7 +794,7 @@ chalk@^5.0.0, chalk@^5.0.1:
   resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz"
   integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
 
-"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
+chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0":
   version "3.5.3"
   resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
   integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -901,206 +891,6 @@ envinfo@^7.8.1:
   resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz"
   integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
 
-esbuild-android-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
-  integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
-
-esbuild-android-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8"
-  integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==
-
-esbuild-android-arm64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
-  integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
-
-esbuild-android-arm64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193"
-  integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==
-
-esbuild-darwin-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
-  integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
-
-esbuild-darwin-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d"
-  integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==
-
-esbuild-darwin-arm64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
-  integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
-
-esbuild-darwin-arm64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997"
-  integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==
-
-esbuild-freebsd-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
-  integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
-
-esbuild-freebsd-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a"
-  integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==
-
-esbuild-freebsd-arm64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
-  integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
-
-esbuild-freebsd-arm64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd"
-  integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==
-
-esbuild-linux-32@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
-  integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
-
-esbuild-linux-32@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32"
-  integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==
-
-esbuild-linux-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
-  integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
-
-esbuild-linux-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9"
-  integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==
-
-esbuild-linux-arm64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
-  integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
-
-esbuild-linux-arm64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d"
-  integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==
-
-esbuild-linux-arm@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
-  integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
-
-esbuild-linux-arm@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5"
-  integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==
-
-esbuild-linux-mips64le@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
-  integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
-
-esbuild-linux-mips64le@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981"
-  integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==
-
-esbuild-linux-ppc64le@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
-  integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
-
-esbuild-linux-ppc64le@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474"
-  integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==
-
-esbuild-linux-riscv64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
-  integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
-
-esbuild-linux-riscv64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896"
-  integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==
-
-esbuild-linux-s390x@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
-  integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
-
-esbuild-linux-s390x@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae"
-  integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==
-
-esbuild-netbsd-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
-  integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
-
-esbuild-netbsd-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8"
-  integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==
-
-esbuild-openbsd-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
-  integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
-
-esbuild-openbsd-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035"
-  integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==
-
-esbuild-sunos-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
-  integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
-
-esbuild-sunos-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141"
-  integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==
-
-esbuild-windows-32@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
-  integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
-
-esbuild-windows-32@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7"
-  integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==
-
-esbuild-windows-64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
-  integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
-
-esbuild-windows-64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9"
-  integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==
-
-esbuild-windows-arm64@0.14.54:
-  version "0.14.54"
-  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
-  integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
-
-esbuild-windows-arm64@0.15.5:
-  version "0.15.5"
-  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b"
-  integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==
-
 esbuild@^0.14.47:
   version "0.14.54"
   resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz"
@@ -1246,11 +1036,6 @@ fs-extra@^10.1.0:
     jsonfile "^6.0.1"
     universalify "^2.0.0"
 
-fsevents@~2.3.2:
-  version "2.3.3"
-  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
-  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
 function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
@@ -1446,7 +1231,7 @@ markdown-it-emoji@^2.0.2:
   resolved "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz"
   integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==
 
-markdown-it@^13.0.1:
+markdown-it@*, markdown-it@^13.0.1:
   version "13.0.1"
   resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz"
   integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==
@@ -1605,7 +1390,7 @@ postcss-value-parser@^4.2.0:
   resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^8.1.10, postcss@^8.4.16:
+postcss@^8.1.0, postcss@^8.1.10, postcss@^8.4.16:
   version "8.4.16"
   resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz"
   integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
@@ -1672,13 +1457,6 @@ reusify@^1.0.4:
   resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-"rollup@>=2.75.6 <2.77.0 || ~2.77.0":
-  version "2.77.3"
-  resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz"
-  integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==
-  optionalDependencies:
-    fsevents "~2.3.2"
-
 rollup@^2.78.1:
   version "2.78.1"
   resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz"
@@ -1686,6 +1464,13 @@ rollup@^2.78.1:
   optionalDependencies:
     fsevents "~2.3.2"
 
+"rollup@>=2.75.6 <2.77.0 || ~2.77.0":
+  version "2.77.3"
+  resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz"
+  integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
 run-parallel@^1.1.9:
   version "1.2.0"
   resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
@@ -1698,7 +1483,7 @@ safe-buffer@~5.2.0:
   resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
-sass@^1.54.5, sass@^1.54.8:
+sass@*, sass@^1.54.5, sass@^1.54.8:
   version "1.54.8"
   resolved "https://registry.npmjs.org/sass/-/sass-1.54.8.tgz"
   integrity sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww==
@@ -1742,7 +1527,7 @@ slash@^4.0.0:
   resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz"
   integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
 
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
+source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0":
   version "1.0.2"
   resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@@ -1831,7 +1616,7 @@ util-deprecate@^1.0.1:
   resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
   integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 
-vite@~3.0.9:
+vite@^3.0.0, vite@~3.0.9:
   version "3.0.9"
   resolved "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz"
   integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==
@@ -1860,7 +1645,7 @@ vue-router@^4.1.4, vue-router@^4.1.5:
   dependencies:
     "@vue/devtools-api" "^6.1.4"
 
-vue@^3.2.37, vue@^3.2.38:
+"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.37, vue@^3.2.38, vue@3.2.38:
   version "3.2.38"
   resolved "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz"
   integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==

From adb02573cf651bf6aa8df26fb03982daf2e53c27 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sat, 4 Jan 2025 09:45:46 +0800
Subject: [PATCH 18/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91pom=E7=89=88=E6=9C=AC?=
 =?UTF-8?q?=E5=8D=87=E7=BA=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 4133dd1aa53..a42e24b3da6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,7 +161,7 @@
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>QLExpress4</artifactId>
-                <version>4.0.0-beta.1</version>
+                <version>4.0.0-beta.2</version>
             </dependency>
             <dependency>
                 <groupId>org.junit</groupId>

From 4f3a518a4f0814c2dd204a1f656b31a3a8c27bc6 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sat, 4 Jan 2025 21:04:29 +0800
Subject: [PATCH 19/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/pom.xml                                  |  4 ++++
 .../com/taobao/arthas/core/GlobalOptions.java | 20 +++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/core/pom.xml b/core/pom.xml
index feab1651739..430215f176d 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -267,6 +267,10 @@
             <scope>provided</scope>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>ognl</groupId>
+            <artifactId>ognl</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index bc40cbefd53..3620931a8cc 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -1,6 +1,12 @@
 package com.taobao.arthas.core;
 
+import java.lang.reflect.Field;
+
 import com.taobao.arthas.common.JavaVersionUtils;
+import com.taobao.arthas.common.UnsafeUtils;
+
+import ognl.OgnlRuntime;
+
 
 /**
  * 全局开关
@@ -139,6 +145,20 @@ public class GlobalOptions {
     )
     public static volatile boolean strict = true;
 
+    public static void updateOnglStrict(boolean strict) {
+        try {
+            Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation");
+            field.setAccessible(true);
+            // 获取字段的内存偏移量和基址
+            Object staticFieldBase = UnsafeUtils.UNSAFE.staticFieldBase(field);
+            long staticFieldOffset = UnsafeUtils.UNSAFE.staticFieldOffset(field);
+
+            // 修改字段的值
+            UnsafeUtils.UNSAFE.putBoolean(staticFieldBase, staticFieldOffset, strict);
+        } catch (NoSuchFieldException | SecurityException e) {
+            // ignore
+        }
+    }
 
     /**
      * 是否切换使用表达式ognl/qlexpress开关

From 564c11a9037f52bd86a349525221a804ee66f8c1 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sat, 4 Jan 2025 21:06:54 +0800
Subject: [PATCH 20/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 3620931a8cc..dd452da7eea 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -7,7 +7,6 @@
 
 import ognl.OgnlRuntime;
 
-
 /**
  * 全局开关
  * Created by vlinux on 15/6/4.
@@ -180,4 +179,5 @@ public static void updateOnglStrict(boolean strict) {
             description = ""
     )
     public static volatile String QLExpressConfig = "";
+
 }

From 23c3df1d4a51c2c220ae60dc7189becd7ff6163f Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sat, 4 Jan 2025 21:52:13 +0800
Subject: [PATCH 21/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index dd452da7eea..231a5bff26d 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -180,4 +180,5 @@ public static void updateOnglStrict(boolean strict) {
     )
     public static volatile String QLExpressConfig = "";
 
+
 }

From 74a84f829d085203435fd0ea3df351e7d23f3c4f Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sat, 4 Jan 2025 21:56:34 +0800
Subject: [PATCH 22/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 231a5bff26d..58b23f95436 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -158,7 +158,6 @@ public static void updateOnglStrict(boolean strict) {
             // ignore
         }
     }
-
     /**
      * 是否切换使用表达式ognl/qlexpress开关
      */
@@ -179,6 +178,6 @@ public static void updateOnglStrict(boolean strict) {
             description = ""
     )
     public static volatile String QLExpressConfig = "";
+}
 
 
-}

From 92cff372ed364c929ac0264c4e0e906a48dfabd8 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 12 Jan 2025 17:14:13 +0800
Subject: [PATCH 23/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/taobao/arthas/core/GlobalOptions.java | 36 +++++++++----------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 58b23f95436..9b90765fb5b 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -16,8 +16,6 @@ public class GlobalOptions {
             + "not allowed to set object properties. "
             + "Want to set object properties, execute `options strict false`";
 
-    public static final String QLEXPRESS_CONFIG = "qlexpress-config";
-
     /**
      * 是否支持系统类<br/>
      * 这个开关打开之后将能代理到来自JVM的部分类,由于有非常强的安全风险可能会引起系统崩溃<br/>
@@ -135,7 +133,8 @@ public class GlobalOptions {
     public static volatile boolean verbose = false;
 
     /**
-     * 是否打开strict 开关
+     * 是否打开strict 开关。更新时注意 ognl 里的配置需要同步修改
+     * @see ognl.OgnlRuntime#getUseStricterInvocationValue()
      */
     @Option(level = 1,
             name = "strict",
@@ -143,21 +142,6 @@ public class GlobalOptions {
             description = STRICT_MESSAGE
     )
     public static volatile boolean strict = true;
-
-    public static void updateOnglStrict(boolean strict) {
-        try {
-            Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation");
-            field.setAccessible(true);
-            // 获取字段的内存偏移量和基址
-            Object staticFieldBase = UnsafeUtils.UNSAFE.staticFieldBase(field);
-            long staticFieldOffset = UnsafeUtils.UNSAFE.staticFieldOffset(field);
-
-            // 修改字段的值
-            UnsafeUtils.UNSAFE.putBoolean(staticFieldBase, staticFieldOffset, strict);
-        } catch (NoSuchFieldException | SecurityException e) {
-            // ignore
-        }
-    }
     /**
      * 是否切换使用表达式ognl/qlexpress开关
      */
@@ -178,6 +162,20 @@ public static void updateOnglStrict(boolean strict) {
             description = ""
     )
     public static volatile String QLExpressConfig = "";
-}
 
+    public static void updateOnglStrict(boolean strict) {
+        try {
+            Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation");
+            field.setAccessible(true);
+            // 获取字段的内存偏移量和基址
+            Object staticFieldBase = UnsafeUtils.UNSAFE.staticFieldBase(field);
+            long staticFieldOffset = UnsafeUtils.UNSAFE.staticFieldOffset(field);
+
+            // 修改字段的值
+            UnsafeUtils.UNSAFE.putBoolean(staticFieldBase, staticFieldOffset, strict);
+        } catch (NoSuchFieldException | SecurityException e) {
+            // ignore
+        }
+    }
 
+}

From 63c648ccc33d7432589e5d0a7f6f1d443437b67f Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 12 Jan 2025 17:19:55 +0800
Subject: [PATCH 24/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 9b90765fb5b..62ae94e288d 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -157,7 +157,7 @@ public class GlobalOptions {
      * qlexpress使用参数
      */
     @Option(level = 1,
-            name = QLEXPRESS_CONFIG,
+            name = "qlexpress-config",
             summary = "config init when use qlexpress, with json-simple, for example: {\"precise\": true }",
             description = ""
     )

From dac03f5c65654269c1ee27754bb3805b431d3736 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 12 Jan 2025 20:06:51 +0800
Subject: [PATCH 25/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/command/express/FlowAttribute.java   |  9 ++++
 .../core/command/express/FlowContext.java     |  9 ++++
 .../core/command/express/QLExpressTest.java   | 50 +++++++++++++++++++
 3 files changed, 68 insertions(+)
 create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java
 create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java
 create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java

diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java b/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java
new file mode 100644
index 00000000000..1848b650ca1
--- /dev/null
+++ b/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java
@@ -0,0 +1,9 @@
+package com.taobao.arthas.core.command.express;
+
+public class FlowAttribute {
+    private String bxApp = "aaa";
+
+    public String getBxApp() {
+     return this.bxApp ;
+    }
+}
diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java b/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java
new file mode 100644
index 00000000000..c1991bdbe79
--- /dev/null
+++ b/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java
@@ -0,0 +1,9 @@
+package com.taobao.arthas.core.command.express;
+
+public class FlowContext {
+    private FlowAttribute flowAttribute = new FlowAttribute();
+
+    public FlowAttribute getFlowAttribute() {
+         return this.flowAttribute ;
+    }
+}
diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java
new file mode 100644
index 00000000000..b701c276b2a
--- /dev/null
+++ b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java
@@ -0,0 +1,50 @@
+package com.taobao.arthas.core.command.express;
+
+import com.taobao.arthas.core.GlobalOptions;
+import com.taobao.arthas.core.advisor.Advice;
+import com.taobao.arthas.core.command.model.ExpressTypeEnum;
+import ognl.OgnlException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * @Author TaoKan
+ * @Date 2025/1/12 5:31 PM
+ */
+public class QLExpressTest {
+
+    private Express express;
+
+    @BeforeEach
+    public void setUp() throws ExpressException {
+        FlowContext context = new FlowContext();
+        Object[] params = new Object[4];
+        params[0] = context;
+        Advice advice = Advice.newForAfterReturning(null, getClass(), null, null, params, null);
+        GlobalOptions.ExpressType = ExpressTypeEnum.QLEXPRESS.getExpressType();
+        express = ExpressFactory.unpooledExpress(null).bind(advice).bind("cost", 123);
+    }
+
+    @Test
+    public void testStringEquals() throws OgnlException, ExpressException {
+        String conditionExpress = "\"aaa\".equals(params[0].flowAttribute.getBxApp())";
+        boolean result = express.is(conditionExpress);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testObjectEquals() throws OgnlException, ExpressException {
+        String conditionExpress = "params[0].flowAttribute.getBxApp().equals(\"aaa\")";
+        boolean result = express.is(conditionExpress);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testEqualSign() throws OgnlException, ExpressException {
+        String conditionExpress = "\"aaa\" == params[0].flowAttribute.getBxApp()";
+        boolean result = express.is(conditionExpress);
+        assertTrue(result);
+    }
+}

From 99f485078c7f675ec069adc7f8c8649cebeff205 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 12 Jan 2025 20:18:18 +0800
Subject: [PATCH 26/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../arthas/core/command/express/OgnlTest.java | 46 +++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java

diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java
new file mode 100644
index 00000000000..b5a8490e2f5
--- /dev/null
+++ b/core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java
@@ -0,0 +1,46 @@
+package com.taobao.arthas.core.command.express;
+
+import com.taobao.arthas.core.advisor.Advice;
+import ognl.OgnlException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * https://github.com/alibaba/arthas/issues/2954
+ */
+public class OgnlTest {
+
+    private Express express;
+
+    @BeforeEach
+    public void setUp() throws OgnlException, ExpressException {
+        FlowContext context = new FlowContext();
+        Object[] params = new Object[4];
+        params[0] = context;
+        Advice advice = Advice.newForAfterReturning(null, getClass(), null, null, params, null);
+        express = ExpressFactory.unpooledExpress(null).bind(advice).bind("cost", 123);
+    }
+
+    @Test
+    public void testStringEquals() throws OgnlException, ExpressException {
+        String conditionExpress = "\"aaa\".equals(params[0].flowAttribute.getBxApp())";
+        boolean result = express.is(conditionExpress);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testObjectEquals() throws OgnlException, ExpressException {
+        String conditionExpress = "params[0].flowAttribute.getBxApp().equals(\"aaa\")";
+        boolean result = express.is(conditionExpress);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testEqualSign() throws OgnlException, ExpressException {
+        String conditionExpress = "\"aaa\" == params[0].flowAttribute.getBxApp()";
+        boolean result = express.is(conditionExpress);
+        assertTrue(result);
+    }
+}

From ded1ca50391a5ae08a0493b559ed1b37d15130f3 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Wed, 12 Feb 2025 22:14:13 +0800
Subject: [PATCH 27/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 site/docs/doc/options.md    |  9 ++++++++-
 site/docs/en/doc/options.md | 10 ++++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/site/docs/doc/options.md b/site/docs/doc/options.md
index 910ed728181..04f348c2929 100644
--- a/site/docs/doc/options.md
+++ b/site/docs/doc/options.md
@@ -19,7 +19,8 @@
 | print-parent-fields    | true   | 是否打印在 parent class 里的 filed                                                                                                                         |
 | verbose                | false  | 是否打印更多详细信息                                                                                                                                       |
 | strict                 | true   | 是否启用 strict 模式                                                                                                                                       |
-
+| express-type           | ognl  | 是否切换使用表达式ognl/qlexpress开关                                                                                              |
+| qlexpress-config       |       | qlexpress4的设置参数,更多信息关注https://github.com/alibaba/QLExpress                                                             |
 ## 查看所有的 options
 
 ```bash
@@ -62,6 +63,12 @@ $ options
         n                             e                     ed to set object properties. Want to set o
                                                             bject properties, execute `options strict
                                                             false`
+ 1      String  express-type  ognl   Option to use ognl/ql  Option to use ognl/qlexpress in commands, 
+                                     express                default ognl, can change to qlexpress.
+ 1      String  qlexpress-config  `` config init when use   config init when use qlexpress, with json
+                                     qlexpress, with json   -simple, more information about https://
+                                     -simple                github.com/alibaba/QLExpress
+
 ```
 
 ## 获取 option 的值
diff --git a/site/docs/en/doc/options.md b/site/docs/en/doc/options.md
index 59c38070135..154c1a69e06 100644
--- a/site/docs/en/doc/options.md
+++ b/site/docs/en/doc/options.md
@@ -7,7 +7,7 @@ Global options
 :::
 
 | Name                   | Default Value | Description                                                                                                                                                                                           |
-| ---------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ---------------------- | ------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 | unsafe                 | false         | whether to enhance to system-level class. Use it with caution since JVM may hang                                                                                                                      |
 | dump                   | false         | whether to dump enhanced class to the external files. If it's on, enhanced class will be dumped into `/${application dir}/arthas-class-dump/`, the specific output path will be output in the console |
 | batch-re-transform     | true          | whether to re-transform matched classes in batch                                                                                                                                                      |
@@ -19,7 +19,8 @@ Global options
 | print-parent-fields    | true          | This option enables print files in parent class, default value true.                                                                                                                                  |
 | verbose                | false         | This option enables print verbose information                                                                                                                                                         |
 | strict                 | true          | whether to enable strict mode                                                                                                                                                                         |
-
+| express-type           | ognl          | Option to use ognl/qlexpress in commands, default ognl, can change to qlexpress                                                                                                                       |
+| qlexpress-config       |               | Set the parameters for qlexpress4, for more information https://github.com/alibaba/QLExpress                                                                                                          |
 ## View all options
 
 ```bash
@@ -62,6 +63,11 @@ $ options
         n                             e                     ed to set object properties. Want to set o
                                                             bject properties, execute `options strict
                                                             false`
+ 1      String  express-type  ognl   Option to use ognl/ql  Option to use ognl/qlexpress in commands, 
+                                     express                default ognl, can change to qlexpress.
+ 1      String  qlexpress-config  `` config init when use   config init when use qlexpress, with json
+                                     qlexpress, with json   -simple, more information about https://
+                                     -simple                github.com/alibaba/QLExpress
 ```
 
 ## Get special option value

From 6dfe5faf333f8bfa696c8d02b0b796ba7a8c0af5 Mon Sep 17 00:00:00 2001
From: "taokankan.tk" <taokan1991@aliyun.com>
Date: Sun, 9 Mar 2025 20:11:35 +0800
Subject: [PATCH 28/28] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/pom.xml                                  |  2 +-
 .../com/taobao/arthas/core/GlobalOptions.java | 11 ----
 .../core/command/express/QLExpress.java       | 51 ++++---------------
 .../core/command/express/QLGlobalContext.java | 32 +++++-------
 pom.xml                                       |  4 +-
 site/docs/doc/options.md                      |  5 --
 site/docs/en/doc/options.md                   |  4 --
 7 files changed, 26 insertions(+), 83 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index 7bbe0004b4b..24dac0d102f 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -213,7 +213,7 @@
         </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
-            <artifactId>QLExpress4</artifactId>
+            <artifactId>qlexpress4</artifactId>
         </dependency>
         <dependency>
             <groupId>org.junit.vintage</groupId>
diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
index 62ae94e288d..83e8df5d982 100644
--- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
+++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java
@@ -152,17 +152,6 @@ public class GlobalOptions {
     )
     public static volatile String ExpressType = "ognl";
 
-
-    /**
-     * qlexpress使用参数
-     */
-    @Option(level = 1,
-            name = "qlexpress-config",
-            summary = "config init when use qlexpress, with json-simple, for example: {\"precise\": true }",
-            description = ""
-    )
-    public static volatile String QLExpressConfig = "";
-
     public static void updateOnglStrict(boolean strict) {
         try {
             Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation");
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
index 5c4da297397..eac806f08d5 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java
@@ -2,15 +2,8 @@
 
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.qlexpress4.ClassSupplier;
-import com.alibaba.qlexpress4.Express4Runner;
-import com.alibaba.qlexpress4.InitOptions;
-import com.alibaba.qlexpress4.QLOptions;
-import com.alibaba.qlexpress4.runtime.ReflectLoader;
+import com.alibaba.qlexpress4.*;
 import com.alibaba.qlexpress4.security.QLSecurityStrategy;
-import com.taobao.arthas.core.GlobalOptions;
-import com.taobao.arthas.core.command.model.QLExpressConfigModel;
 
 
 /**
@@ -31,52 +24,28 @@ public QLExpress() {
     }
 
     public QLExpress(ClassSupplier classResolver) {
-        initQLExpress(classResolver);
-        initConfig();
-        initContext();
+        this.initOptions = initQLExpress(classResolver);
+        this.expressRunner = QLExpressRunner.getInstance(initOptions);
+        this.qlOptions = initConfig();
+        this.qlGlobalContext = new QLGlobalContext(expressRunner);
     }
 
-    private void initConfig() {
-        try {
-            if (GlobalOptions.QLExpressConfig.length() > 0) {
-                QLOptions.Builder qlOptionsBuilder = QLOptions.builder();
-                QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class);
-                qlOptionsBuilder.cache(qlExpressConfigModel.isCache());
-                qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer());
-                qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength());
-                qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext());
-                qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise());
-                qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis());
-                qlOptions = qlOptionsBuilder.build();
-            }else {
-                qlOptions = QLOptions.DEFAULT_OPTIONS;
-            }
-            //4.0设置InitOptions
-        }catch (Throwable t){
-            //异常不设置options
-            logger.error("Error Init Options For QLExpress:", t);
-        }
+    private QLOptions initConfig() {
+        return QLOptions.DEFAULT_OPTIONS;
     }
 
-    private void initQLExpress(ClassSupplier classResolver) {
+    private InitOptions initQLExpress(ClassSupplier classResolver) {
         InitOptions.Builder initOptionsBuilder = InitOptions.builder();
         initOptionsBuilder.securityStrategy(QLSecurityStrategy.open());
         initOptionsBuilder.allowPrivateAccess(true);
         initOptionsBuilder.classSupplier(classResolver);
-        initOptions = initOptionsBuilder.build();
-        expressRunner = QLExpressRunner.getInstance(initOptions);
-    }
-
-    private void initContext() {
-        ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.isAllowPrivateAccess());
-        qlGlobalContext = new QLGlobalContext(reflectLoader);
+        return initOptionsBuilder.build();
     }
 
     @Override
     public Object get(String express) throws ExpressException {
         try {
-            Object result = expressRunner.execute(express, qlGlobalContext, qlOptions);
-            return result;
+            return expressRunner.execute(express, qlGlobalContext, qlOptions).getResult();
         } catch (Exception e) {
             logger.error("Error during evaluating the expression with QLExpress:", e);
             throw new ExpressException(express, e);
diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
index fa6e46f9054..70bdb680c6e 100644
--- a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
+++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java
@@ -3,10 +3,13 @@
 import com.alibaba.arthas.deps.org.slf4j.Logger;
 import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.qlexpress4.Express4Runner;
 import com.alibaba.qlexpress4.exception.PureErrReporter;
 import com.alibaba.qlexpress4.runtime.ReflectLoader;
 import com.alibaba.qlexpress4.runtime.Value;
 import com.alibaba.qlexpress4.runtime.context.ExpressContext;
+import com.alibaba.qlexpress4.runtime.context.ObjectFieldExpressContext;
 import com.alibaba.qlexpress4.runtime.data.MapItemValue;
 
 import java.util.Map;
@@ -18,14 +21,13 @@
  */
 public class QLGlobalContext implements ExpressContext {
     private static final Logger logger = LoggerFactory.getLogger(QLGlobalContext.class);
-
     private Map<String, Object> context;
-    private Object object;
-    private ReflectLoader reflectLoader;
+    private ObjectFieldExpressContext objectFieldExpressContext;
+    private Express4Runner express4Runner;
 
-    public QLGlobalContext(ReflectLoader reflectLoader) {
+    public QLGlobalContext(Express4Runner expressRunner) {
         this.context = new ConcurrentHashMap<>();
-        this.reflectLoader = reflectLoader;
+        this.express4Runner = expressRunner;
     }
 
     public void put(String name, Object value){
@@ -34,20 +36,20 @@ public void put(String name, Object value){
 
     public void clear() {
         context.clear();
-        this.context.put("reflectLoader",reflectLoader);
     }
 
     public void bindObj(Object object) {
-        this.object = object;
+        ObjectFieldExpressContext objectFieldExpressContext = new ObjectFieldExpressContext(object, express4Runner);
+        this.objectFieldExpressContext = objectFieldExpressContext;
         context.put("object",object);
     }
     @Override
     public Value get(Map<String, Object> attachments, String variableName) {
-        if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) {
-            return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE);
+        Value getFromLoadField = objectFieldExpressContext.get(attachments, variableName);
+        if (getFromLoadField == null || getFromLoadField.get() == null) {
+            return new MapItemValue(this.context, variableName);
         }
-        String newVariableName = variableName.replace("#","");
-        return new MapItemValue(this.context, newVariableName);
+        return getFromLoadField;
     }
 
 
@@ -59,12 +61,4 @@ public void setContext(Map<String, Object> context) {
         this.context = context;
     }
 
-    public Object getObject() {
-        return object;
-    }
-
-    public void setObject(Object object) {
-        this.object = object;
-    }
-
 }
diff --git a/pom.xml b/pom.xml
index bba957fec9d..51935f51784 100644
--- a/pom.xml
+++ b/pom.xml
@@ -165,8 +165,8 @@
             </dependency>
             <dependency>
                 <groupId>com.alibaba</groupId>
-                <artifactId>QLExpress4</artifactId>
-                <version>4.0.0-beta.2</version>
+                <artifactId>qlexpress4</artifactId>
+                <version>4.0.0-beta.5</version>
             </dependency>
             <dependency>
                 <groupId>org.junit</groupId>
diff --git a/site/docs/doc/options.md b/site/docs/doc/options.md
index 04f348c2929..64466d84c51 100644
--- a/site/docs/doc/options.md
+++ b/site/docs/doc/options.md
@@ -20,7 +20,6 @@
 | verbose                | false  | 是否打印更多详细信息                                                                                                                                       |
 | strict                 | true   | 是否启用 strict 模式                                                                                                                                       |
 | express-type           | ognl  | 是否切换使用表达式ognl/qlexpress开关                                                                                              |
-| qlexpress-config       |       | qlexpress4的设置参数,更多信息关注https://github.com/alibaba/QLExpress                                                             |
 ## 查看所有的 options
 
 ```bash
@@ -65,10 +64,6 @@ $ options
                                                             false`
  1      String  express-type  ognl   Option to use ognl/ql  Option to use ognl/qlexpress in commands, 
                                      express                default ognl, can change to qlexpress.
- 1      String  qlexpress-config  `` config init when use   config init when use qlexpress, with json
-                                     qlexpress, with json   -simple, more information about https://
-                                     -simple                github.com/alibaba/QLExpress
-
 ```
 
 ## 获取 option 的值
diff --git a/site/docs/en/doc/options.md b/site/docs/en/doc/options.md
index 154c1a69e06..42df2da90a1 100644
--- a/site/docs/en/doc/options.md
+++ b/site/docs/en/doc/options.md
@@ -20,7 +20,6 @@ Global options
 | verbose                | false         | This option enables print verbose information                                                                                                                                                         |
 | strict                 | true          | whether to enable strict mode                                                                                                                                                                         |
 | express-type           | ognl          | Option to use ognl/qlexpress in commands, default ognl, can change to qlexpress                                                                                                                       |
-| qlexpress-config       |               | Set the parameters for qlexpress4, for more information https://github.com/alibaba/QLExpress                                                                                                          |
 ## View all options
 
 ```bash
@@ -65,9 +64,6 @@ $ options
                                                             false`
  1      String  express-type  ognl   Option to use ognl/ql  Option to use ognl/qlexpress in commands, 
                                      express                default ognl, can change to qlexpress.
- 1      String  qlexpress-config  `` config init when use   config init when use qlexpress, with json
-                                     qlexpress, with json   -simple, more information about https://
-                                     -simple                github.com/alibaba/QLExpress
 ```
 
 ## Get special option value