You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/06/15 02:33:48 UTC

[dubbo] branch 2.7-native_image updated: support native image (#8047)

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch 2.7-native_image
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/2.7-native_image by this push:
     new baa2fe3  support native image (#8047)
baa2fe3 is described below

commit baa2fe3f524d2a58c3515fe73a3699a7342fb0ae
Author: 张志勇 <go...@163.com>
AuthorDate: Tue Jun 15 10:32:56 2021 +0800

    support native image (#8047)
---
 .../common/compiler/support/JavassistCompiler.java |    7 +
 .../dubbo/common/compiler/support/JdkCompiler.java |    9 +
 .../dubbo/common/extension/ExtensionLoader.java    |   13 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |    4 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |    5 +-
 .../dubbo-demo-native-consumer/pom.xml             |  139 +++
 .../dubbo/demo/graalvm/consumer/Application.java   |   77 ++
 .../src/main/resources/Log4j.properties            |    5 +
 .../META-INF/native-image/jni-config.json          |    2 +
 .../META-INF/native-image/proxy-config.json        |    3 +
 .../META-INF/native-image/reflect-config.json      | 1036 ++++++++++++++++++++
 .../META-INF/native-image/resource-config.json     |   47 +
 .../native-image/serialization-config.json         |    2 +
 .../dubbo-demo-native-interface/pom.xml            |   15 +
 .../org/apace/dubbo/graalvm/demo/DemoService.java  |   23 +
 .../dubbo-demo-native-provider/pom.xml             |  134 +++
 .../dubbo/demo/graalvm/provider/Application.java   |   77 ++
 .../demo/graalvm/provider/DemoServiceImpl.java     |   33 +
 .../META-INF/native-image/jni-config.json          |    2 +
 .../META-INF/native-image/proxy-config.json        |    2 +
 .../META-INF/native-image/reflect-config.json      |  981 ++++++++++++++++++
 .../META-INF/native-image/resource-config.json     |   52 +
 .../native-image/serialization-config.json         |    2 +
 dubbo-demo/dubbo-demo-native/pom.xml               |   21 +
 dubbo-demo/pom.xml                                 |    1 +
 dubbo-graalvm/pom.xml                              |   64 ++
 .../common/threadpool/ThreadPool$Adaptive.java     |   15 +
 .../report/MetadataReportFactory$Adaptive.java     |   15 +
 .../dubbo/monitor/MonitorFactory$Adaptive.java     |   12 +
 .../dubbo/registry/RegistryFactory$Adaptive.java   |   12 +
 .../apache/dubbo/remoting/Dispatcher$Adaptive.java |   12 +
 .../dubbo/remoting/Transporter$Adaptive.java       |   25 +
 .../zookeeper/ZookeeperTransporter$Adaptive.java   |   15 +
 .../org/apache/dubbo/rpc/Protocol$Adaptive.java    |   39 +
 .../apache/dubbo/rpc/ProxyFactory$Adaptive.java    |   39 +
 .../apache/dubbo/rpc/cluster/Cluster$Adaptive.java |   19 +
 .../rpc/cluster/ConfiguratorFactory$Adaptive.java  |   15 +
 .../dubbo/rpc/cluster/RouterFactory$Adaptive.java  |   15 +
 .../store/InMemoryWritableMetadataService.java     |    3 +-
 .../dubbo/rpc/proxy/AbstractProxyFactory.java      |    6 +-
 pom.xml                                            |    1 +
 41 files changed, 2993 insertions(+), 6 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java
index 0a77d5c..9278aac 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java
@@ -42,6 +42,13 @@ public class JavassistCompiler extends AbstractCompiler {
 
     @Override
     public Class<?> doCompile(String name, String source) throws Throwable {
+        try {
+            Class<?> res = Class.forName(name);
+            return res;
+        } catch (Throwable ex) {
+            //ignore
+        }
+
         CtClassBuilder builder = new CtClassBuilder();
         builder.setClassName(name);
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
index e5d5b22..6110d42 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
@@ -37,6 +37,8 @@ import java.io.OutputStream;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
@@ -113,6 +115,13 @@ public class JdkCompiler extends AbstractCompiler {
 
     @Override
     public Class<?> doCompile(String name, String sourceCode) throws Throwable {
+        try {
+            Class<?> res = Class.forName(name);
+            return res;
+        } catch (Throwable ex) {
+            //ignore
+        }
+
         int i = name.lastIndexOf('.');
         String packageName = i < 0 ? "" : name.substring(0, i);
         String className = i < 0 ? name : name.substring(i + 1);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index d85a34c..6e96462 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -1067,6 +1067,12 @@ public class ExtensionLoader<T> {
     }
 
     private Class<?> createAdaptiveExtensionClass() {
+        try {
+            Class c = Class.forName(generatePackageInfo() + "." + type.getSimpleName() + "$Adaptive");
+            return c;
+        } catch (Throwable e) {
+            //ignore
+        }
         String code = new AdaptiveClassCodeGenerator(type, cachedDefaultName).generate();
         ClassLoader classLoader = findClassLoader();
         org.apache.dubbo.common.compiler.Compiler compiler =
@@ -1074,6 +1080,13 @@ public class ExtensionLoader<T> {
         return compiler.compile(code, classLoader);
     }
 
+
+    private static final String CODE_PACKAGE = "%s";
+
+    private String generatePackageInfo() {
+        return String.format(CODE_PACKAGE, type.getPackage().getName());
+    }
+
     @Override
     public String toString() {
         return this.getClass().getName() + "[" + type.getName() + "]";
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index e699000..b96cbbb 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -259,7 +259,9 @@ public class ReferenceConfig<T> extends ReferenceConfigBase<T> {
                 map.put(REVISION_KEY, revision);
             }
 
-            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();
+//            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();
+            String[] methods = Arrays.stream(interfaceClass.getMethods()).map(it->it.getName()).toArray(String[]::new);
+
             if (methods.length == 0) {
                 logger.warn("No method found in service interface " + interfaceClass.getName());
                 map.put(METHODS_KEY, ANY_VALUE);
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 0afbf18..d5c4a95 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -465,7 +465,10 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
                 map.put(REVISION_KEY, revision);
             }
 
-            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();
+//            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();
+
+            String[] methods = Arrays.stream(interfaceClass.getMethods()).map(it->it.getName()).toArray(String[]::new);
+
             if (methods.length == 0) {
                 logger.warn("No method found in service interface " + interfaceClass.getName());
                 map.put(METHODS_KEY, ANY_VALUE);
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
new file mode 100644
index 0000000..3612ed7
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>dubbo-demo-native</artifactId>
+        <groupId>org.apache.dubbo</groupId>
+        <version>2.7.12-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-demo-native-consumer</artifactId>
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-demo-native-interface</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-multicast</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-zookeeper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-zookeeper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-dubbo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty4</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-hessian2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-graalvm</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+        </dependency>
+
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.7.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <fork>true</fork>
+                    <verbose>true</verbose>
+                    <encoding>UTF-8</encoding>
+                    <compilerArguments>
+                        <sourcepath>
+                            ${project.basedir}/src/main/java
+                        </sourcepath>
+                    </compilerArguments>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.graalvm.nativeimage</groupId>
+                <artifactId>native-image-maven-plugin</artifactId>
+                <version>21.0.0.2</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>native-image</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <skip>false</skip>
+                    <imageName>demo-native-consumer</imageName>
+                    <mainClass>com.apache.dubbo.demo.graalvm.consumer.Application</mainClass>
+                    <buildArgs>
+                        --no-fallback
+
+                        --initialize-at-build-time=org.slf4j.MDC
+                        --initialize-at-build-time=org.slf4j.LoggerFactory
+                        --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder
+                        --initialize-at-build-time=org.apache.log4j.helpers.Loader
+                        --initialize-at-build-time=org.apache.log4j.Logger
+                        --initialize-at-build-time=org.apache.log4j.helpers.LogLog
+                        --initialize-at-build-time=org.apache.log4j.LogManager
+                        --initialize-at-build-time=org.apache.log4j.spi.LoggingEvent
+                        --initialize-at-build-time=org.slf4j.impl.Log4jLoggerFactory
+                        --initialize-at-build-time=org.slf4j.impl.Log4jLoggerAdapter
+
+
+
+                        --initialize-at-run-time=io.netty.channel.epoll.Epoll
+                        --initialize-at-run-time=io.netty.channel.epoll.Native
+                        --initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop
+                        --initialize-at-run-time=io.netty.channel.epoll.EpollEventArray
+                        --initialize-at-run-time=io.netty.channel.DefaultFileRegion
+                        --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray
+                        --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop
+                        --initialize-at-run-time=io.netty.channel.kqueue.Native
+                        --initialize-at-run-time=io.netty.channel.unix.Errors
+                        --initialize-at-run-time=io.netty.channel.unix.IovArray
+                        --initialize-at-run-time=io.netty.channel.unix.Limits
+                        --initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger
+                        --initialize-at-run-time=io.netty.channel.unix.Socket
+                        --initialize-at-run-time=io.netty.channel.ChannelHandlerMask
+
+                        --report-unsupported-elements-at-runtime
+                        --allow-incomplete-classpath
+                        --enable-url-protocols=http
+                        -H:+ReportExceptionStackTraces
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java
new file mode 100644
index 0000000..32609eb
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.apache.dubbo.demo.graalvm.consumer;
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.utils.ReferenceConfigCache;
+
+import org.apace.dubbo.graalvm.demo.DemoService;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Application {
+
+    public static void main(String[] args) {
+        System.setProperty("dubbo.application.logger", "log4j");
+        if (isClassic(args)) {
+            runWithRefer();
+        } else {
+            runWithBootstrap();
+        }
+    }
+
+    private static boolean isClassic(String[] args) {
+        return args.length > 0 && "classic".equalsIgnoreCase(args[0]);
+    }
+
+    private static void runWithBootstrap() {
+        ReferenceConfig<DemoService> reference = new ReferenceConfig<>();
+        reference.setInterface(DemoService.class);
+        reference.setGeneric("false");
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        ApplicationConfig applicationConfig =  new ApplicationConfig("dubbo-demo-api-consumer");
+        applicationConfig.setQosEnable(false);
+        applicationConfig.setCompiler("jdk");
+        Map<String,String> m = new HashMap<>(1);
+        m.put("proxy","jdk");
+        applicationConfig.setParameters(m);
+
+        bootstrap.application(applicationConfig)
+                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
+                .reference(reference)
+                .start();
+
+        DemoService demoService = ReferenceConfigCache.getCache().get(reference);
+        String message = demoService.sayHello("dubbo");
+        System.out.println(message);
+    }
+
+    private static void runWithRefer() {
+        ReferenceConfig<DemoService> reference = new ReferenceConfig<>();
+        reference.setApplication(new ApplicationConfig("dubbo-demo-api-consumer"));
+        reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
+        reference.setInterface(DemoService.class);
+        DemoService service = reference.get();
+        String message = service.sayHello("dubbo");
+        System.out.println(message);
+    }
+}
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/Log4j.properties b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/Log4j.properties
new file mode 100644
index 0000000..32fc0e5
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/Log4j.properties
@@ -0,0 +1,5 @@
+log4j.rootLogger=error, console
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=[%-12d{HH\:mm\:ss.SS}] [%p] %l %m%n
\ No newline at end of file
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/jni-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/jni-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/jni-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/proxy-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/proxy-config.json
new file mode 100644
index 0000000..572a0c8
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/proxy-config.json
@@ -0,0 +1,3 @@
+[
+  ["org.apace.dubbo.graalvm.demo.DemoService","org.apache.dubbo.rpc.service.EchoService","org.apache.dubbo.rpc.service.Destroyable"]
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json
new file mode 100644
index 0000000..1596d30
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json
@@ -0,0 +1,1036 @@
+[
+{
+  "name":"com.alibaba.dubbo.rpc.service.GenericService",
+  "allPublicMethods":true
+},
+{
+  "name":"com.intellij.rt.execution.application.AppMainV2$Agent",
+  "methods":[{"name":"premain","parameterTypes":["java.lang.String","java.lang.instrument.Instrumentation"] }]
+},
+{
+  "name":"io.netty.buffer.AbstractByteBufAllocator",
+  "allDeclaredMethods":true
+},
+{
+  "name":"io.netty.buffer.AbstractReferenceCountedByteBuf",
+  "fields":[{"name":"refCnt", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.channel.ChannelDuplexHandler",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelHandlerAdapter",
+  "methods":[{"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }]
+},
+{
+  "name":"io.netty.channel.ChannelInboundHandlerAdapter",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelInitializer",
+  "methods":[
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelOutboundHandlerAdapter",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "name":"io.netty.channel.DefaultChannelPipeline$HeadContext",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"io.netty.channel.DefaultChannelPipeline$TailContext",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }
+  ]
+},
+{
+  "name":"io.netty.channel.socket.nio.NioSocketChannel",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"io.netty.handler.codec.ByteToMessageDecoder",
+  "methods":[
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }
+  ]
+},
+{
+  "name":"io.netty.handler.codec.MessageToByteEncoder",
+  "methods":[{"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }]
+},
+{
+  "name":"io.netty.handler.timeout.IdleStateHandler",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"io.netty.util.ReferenceCountUtil",
+  "allDeclaredMethods":true
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.io.File",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Number",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true
+},
+{
+  "name":"java.lang.Object",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true
+},
+{
+  "name":"java.lang.StackTraceElement",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allDeclaredConstructors":true
+},
+{
+  "name":"java.lang.Thread",
+  "methods":[{"name":"getContextClassLoader","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.Throwable",
+  "fields":[
+    {"name":"detailMessage"}, 
+    {"name":"stackTrace"}
+  ]
+},
+{
+  "name":"java.lang.management.ManagementFactory",
+  "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.management.RuntimeMXBean",
+  "methods":[{"name":"getName","parameterTypes":[] }]
+},
+{
+  "name":"java.math.BigDecimal",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.math.BigInteger",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allDeclaredConstructors":true
+},
+{
+  "name":"java.nio.Bits",
+  "methods":[{"name":"unaligned","parameterTypes":[] }]
+},
+{
+  "name":"java.nio.Buffer",
+  "fields":[{"name":"address", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.nio.DirectByteBuffer",
+  "fields":[{"name":"cleaner", "allowUnsafeAccess":true}],
+  "methods":[{"name":"<init>","parameterTypes":["long","int"] }]
+},
+{
+  "name":"java.sql.Date",
+  "methods":[{"name":"<init>","parameterTypes":["long"] }]
+},
+{
+  "name":"java.sql.Time",
+  "methods":[{"name":"<init>","parameterTypes":["long"] }]
+},
+{
+  "name":"java.sql.Timestamp",
+  "methods":[{"name":"<init>","parameterTypes":["long"] }]
+},
+{
+  "name":"java.time.Duration"
+},
+{
+  "name":"java.time.Instant"
+},
+{
+  "name":"java.time.LocalDate"
+},
+{
+  "name":"java.time.LocalDateTime"
+},
+{
+  "name":"java.time.LocalTime"
+},
+{
+  "name":"java.time.MonthDay"
+},
+{
+  "name":"java.time.OffsetDateTime"
+},
+{
+  "name":"java.time.OffsetTime"
+},
+{
+  "name":"java.time.Period"
+},
+{
+  "name":"java.time.Year"
+},
+{
+  "name":"java.time.YearMonth"
+},
+{
+  "name":"java.time.ZoneId"
+},
+{
+  "name":"java.time.ZoneOffset"
+},
+{
+  "name":"java.time.ZonedDateTime"
+},
+{
+  "name":"java.util.AbstractMap",
+  "allDeclaredMethods":true
+},
+{
+  "name":"java.util.HashMap",
+  "allDeclaredMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"java.util.Map",
+  "allPublicConstructors":true
+},
+{
+  "name":"java.util.concurrent.ConcurrentNavigableMap"
+},
+{
+  "name":"java.util.concurrent.ConcurrentSkipListMap"
+},
+{
+  "name":"javax.management.ObjectName",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"org.apace.dubbo.graalvm.demo.DemoService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.common.config.Environment",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfigurationFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.config.configcenter.nop.NopDynamicConfigurationFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.extension.factory.SpiExtensionFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.infra.support.EnvironmentAdapter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.jcl.JclLoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.log4j2.Log4j2LoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.serialize.hessian2.dubbo.DefaultHessian2FactoryInitializer",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.serialize.hessian2.dubbo.WhitelistHessian2FactoryInitializer",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.ThreadPool$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.cached.CachedThreadPool",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.eager.EagerThreadPool",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.fixed.FixedThreadPool",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.limited.LimitedThreadPool",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.config.AbstractConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractInterfaceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractMethodConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractReferenceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractServiceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ApplicationConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ConfigCenterConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ConsumerConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.MetadataReportConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.MetricsConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ModuleConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.MonitorConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ProviderConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ReferenceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ReferenceConfigBase",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.RegistryConfig",
+  "allPublicMethods":true,
+  "fields":[
+    {"name":"accepts"}, 
+    {"name":"address"}, 
+    {"name":"check"}, 
+    {"name":"client"}, 
+    {"name":"cluster"}, 
+    {"name":"dynamic"}, 
+    {"name":"extraKeys"}, 
+    {"name":"file"}, 
+    {"name":"group"}, 
+    {"name":"password"}, 
+    {"name":"port"}, 
+    {"name":"preferred"}, 
+    {"name":"protocol"}, 
+    {"name":"register"}, 
+    {"name":"server"}, 
+    {"name":"session"}, 
+    {"name":"simplified"}, 
+    {"name":"subscribe"}, 
+    {"name":"timeout"}, 
+    {"name":"transporter"}, 
+    {"name":"useAsConfigCenter"}, 
+    {"name":"useAsMetadataCenter"}, 
+    {"name":"username"}, 
+    {"name":"version"}, 
+    {"name":"wait"}, 
+    {"name":"weight"}, 
+    {"name":"zone"}
+  ]
+},
+{
+  "name":"org.apache.dubbo.config.SslConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.context.ConfigManager",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.config.event.listener.LoggingEventListener",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.event.DirectEventDispatcher",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.event.GenericEventListener",
+  "methods":[{"name":"onEvent","parameterTypes":["org.apache.dubbo.event.Event"] }]
+},
+{
+  "name":"org.apache.dubbo.event.ParallelEventDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.monitor.MetricsService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.monitor.MonitorService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.monitor.support.MetricsServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.monitor.support.MonitorFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.monitor.support.MonitorServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.RegistryFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.RegistryFactoryWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.registry.RegistryFactory"] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.DefaultServiceDiscoveryFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.event.listener.LoggingEventListener",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.metadata.MetadataServiceNameMapping",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.migration.DefaultMigrationAddressComparator",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.migration.MigrationRuleListener",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.integration.RegistryProtocol",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.multicast.MulticastRegistryFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.zookeeper.ZookeeperRegistryFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.zookeeper.ZookeeperServiceDiscoveryFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.Dispatcher$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.Transporter$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.exchange.codec.ExchangeCodec",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.exchange.support.header.HeaderExchanger",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.telnet.codec.TelnetCodec",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.codec.TransportCodec",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.all.AllDispatcher",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.all2.AllDispatcher2",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.message.MessageOnlyDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyClient$1"
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyClientHandler",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalDecoder"
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder"
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyTransporter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.Protocol$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.ProxyFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.Cluster$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.ConfiguratorFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.RouterFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.configurator.absent.AbsentConfiguratorFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.configurator.override.OverrideConfiguratorFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.governance.DefaultGovernanceRuleRepositoryImpl",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.interceptor.ConsumerContextClusterInterceptor",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.interceptor.ZoneAwareClusterInterceptor",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.loadbalance.ShortestResponseLoadBalance",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.address.AddressRouterFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.condition.ConditionRouterFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.condition.config.AppRouterFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.condition.config.ServiceRouterFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.file.FileRouterFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.mock.MockRouterFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.router.tag.TagRouterFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.AvailableCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.BroadcastCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.BroadcastCluster2",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.FailbackCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.FailfastCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.FailoverCluster",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.FailsafeCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.ForkingCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.MergeableCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.merger.DefaultProviderURLMergeProcessor",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.cluster.Cluster"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.AccessLogFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ActiveLimitFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ClassLoaderFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.CompatibleFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ConsumerContextFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ContextFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.DeprecatedFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.EchoFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ExceptionFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ExecuteLimitFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.GenericFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.GenericImplFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.TimeoutFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.TokenFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.TpsLimitFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.listener.DeprecatedInvokerListener",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.model.ServiceRepository",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.Protocol"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.Protocol"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.proxy.jdk.JdkProxyFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.ProxyFactory"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.service.Destroyable",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.rpc.service.EchoService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.rpc.service.EchoServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.service.GenericService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.rpc.service.GenericServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.support.MockProtocol",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.log4j.Category"
+},
+{
+  "name":"org.apache.log4j.CategoryKey"
+},
+{
+  "name":"org.apache.log4j.Logger"
+},
+{
+  "name":"org.apache.log4j.helpers.Loader"
+},
+{
+  "name":"org.apache.zookeeper.ClientCnxnSocketNIO",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.misc.Cleaner",
+  "methods":[{"name":"clean","parameterTypes":[] }]
+},
+{
+  "name":"sun.misc.Unsafe",
+  "fields":[{"name":"theUnsafe"}],
+  "methods":[
+    {"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] }, 
+    {"name":"getAndAddLong","parameterTypes":["java.lang.Object","long","long"] }, 
+    {"name":"getAndSetObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }
+  ]
+},
+{
+  "name":"sun.misc.VM",
+  "methods":[{"name":"maxDirectMemory","parameterTypes":[] }]
+},
+{
+  "name":"sun.nio.ch.SelectorImpl",
+  "fields":[
+    {"name":"publicSelectedKeys"}, 
+    {"name":"selectedKeys"}
+  ]
+},
+{
+  "name":"sun.security.provider.ConfigFile",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+}
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/resource-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/resource-config.json
new file mode 100644
index 0000000..c1245cc
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/resource-config.json
@@ -0,0 +1,47 @@
+{
+  "resources":{
+  "includes":[
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.context.FrameworkExt\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.infra.InfraAdapter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.logger.LoggerAdapter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.serialize.hessian2.dubbo.Hessian2FactoryInitializer\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.threadpool.ThreadPool\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.threadpool.manager.ExecutorRepository\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.event.EventListener\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.MigrationAddressComparator\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.Codec2\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.Dispatcher\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.Transporter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.exchange.Exchanger\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.Filter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.InvokerListener\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.ProxyFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Cluster\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ConfiguratorFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.LoadBalance\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ProviderURLMergeProcessor\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector\\E"}, 
+    {"pattern":"\\QMETA-INF/services/org.apache.dubbo.common.extension.LoadingStrategy\\E"},
+    {"pattern":"\\Qlog4j.properties\\E"},
+    {"pattern":"\\Qorg/apache/dubbo/common/Version.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/remoting/RemotingException.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/remoting/Transporters.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/remoting/exchange/Exchangers.class\\E"}, 
+    {"pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"}
+  ]},
+  "bundles":[]
+}
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/serialization-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/serialization-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/serialization-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-interface/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-interface/pom.xml
new file mode 100644
index 0000000..f1e2eec
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-interface/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>dubbo-demo-native</artifactId>
+        <groupId>org.apache.dubbo</groupId>
+        <version>2.7.12-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-demo-native-interface</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-interface/src/main/java/org/apace/dubbo/graalvm/demo/DemoService.java b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-interface/src/main/java/org/apace/dubbo/graalvm/demo/DemoService.java
new file mode 100644
index 0000000..1f53e9c
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-interface/src/main/java/org/apace/dubbo/graalvm/demo/DemoService.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apace.dubbo.graalvm.demo;
+
+public interface DemoService {
+
+    String sayHello(String name);
+
+}
\ No newline at end of file
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
new file mode 100644
index 0000000..96ae2dd
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>dubbo-demo-native</artifactId>
+        <groupId>org.apache.dubbo</groupId>
+        <version>2.7.12-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-demo-native-provider</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-demo-native-interface</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-multicast</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-zookeeper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-dubbo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty4</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-hessian2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-graalvm</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.7.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <fork>true</fork>
+                    <verbose>true</verbose>
+                    <encoding>UTF-8</encoding>
+                    <compilerArguments>
+                        <sourcepath>
+                            ${project.basedir}/src/main/java
+                        </sourcepath>
+                    </compilerArguments>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.graalvm.nativeimage</groupId>
+                <artifactId>native-image-maven-plugin</artifactId>
+                <version>21.0.0.2</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>native-image</goal>
+                        </goals>
+                        <phase>package</phase>
+                    </execution>
+                </executions>
+                <configuration>
+                    <skip>false</skip>
+                    <imageName>demo-native-provider</imageName>
+                    <mainClass>org.apache.dubbo.demo.graalvm.provider.Application</mainClass>
+                    <buildArgs>
+                        --no-fallback
+
+                        --initialize-at-build-time=org.slf4j.MDC
+                        --initialize-at-build-time=org.slf4j.LoggerFactory
+                        --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder
+                        --initialize-at-build-time=org.apache.log4j.helpers.Loader
+                        --initialize-at-build-time=org.apache.log4j.Logger
+                        --initialize-at-build-time=org.apache.log4j.helpers.LogLog
+                        --initialize-at-build-time=org.apache.log4j.LogManager
+                        --initialize-at-build-time=org.apache.log4j.spi.LoggingEvent
+                        --initialize-at-build-time=org.slf4j.impl.Log4jLoggerFactory
+                        --initialize-at-build-time=org.slf4j.impl.Log4jLoggerAdapter
+
+
+
+                        --initialize-at-run-time=io.netty.channel.epoll.Epoll
+                        --initialize-at-run-time=io.netty.channel.epoll.Native
+                        --initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop
+                        --initialize-at-run-time=io.netty.channel.epoll.EpollEventArray
+                        --initialize-at-run-time=io.netty.channel.DefaultFileRegion
+                        --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray
+                        --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop
+                        --initialize-at-run-time=io.netty.channel.kqueue.Native
+                        --initialize-at-run-time=io.netty.channel.unix.Errors
+                        --initialize-at-run-time=io.netty.channel.unix.IovArray
+                        --initialize-at-run-time=io.netty.channel.unix.Limits
+                        --initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger
+                        --initialize-at-run-time=io.netty.channel.unix.Socket
+                        --initialize-at-run-time=io.netty.channel.ChannelHandlerMask
+
+                        --report-unsupported-elements-at-runtime
+                        --allow-incomplete-classpath
+                        --enable-url-protocols=http
+                        -H:+ReportExceptionStackTraces
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java
new file mode 100644
index 0000000..5346ea1
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo.graalvm.provider;
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
+import org.apace.dubbo.graalvm.demo.DemoService;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+
+public class Application {
+
+    public static void main(String[] args) throws Exception {
+        System.setProperty("dubbo.application.logger", "jdk");
+        if (isClassic(args)) {
+            startWithExport();
+        } else {
+            startWithBootstrap();
+        }
+    }
+
+    private static boolean isClassic(String[] args) {
+        return args.length > 0 && "classic".equalsIgnoreCase(args[0]);
+    }
+
+    private static void startWithBootstrap() {
+        ServiceConfig<DemoServiceImpl> service = new ServiceConfig<>();
+        service.setInterface(DemoService.class);
+        service.setRef(new DemoServiceImpl());
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+
+        ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-demo-api-provider");
+        applicationConfig.setQosEnable(false);
+        applicationConfig.setCompiler("jdk");
+        Map<String,String> m = new HashMap<>(1);
+        m.put("proxy","jdk");
+        applicationConfig.setParameters(m);
+
+        bootstrap.application(applicationConfig)
+                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
+                .service(service)
+                .start()
+                .await();
+    }
+
+    private static void startWithExport() throws InterruptedException {
+        ServiceConfig<DemoServiceImpl> service = new ServiceConfig<>();
+        service.setInterface(DemoService.class);
+        service.setRef(new DemoServiceImpl());
+        service.setApplication(new ApplicationConfig("dubbo-demo-api-provider"));
+        service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
+        service.export();
+
+        System.out.println("dubbo service started");
+        new CountDownLatch(1).await();
+    }
+}
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java
new file mode 100644
index 0000000..b900308
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo.graalvm.provider;
+
+import org.apache.dubbo.rpc.RpcContext;
+
+import org.apace.dubbo.graalvm.demo.DemoService;
+
+
+public class DemoServiceImpl implements DemoService {
+
+    @Override
+    public String sayHello(String name) {
+        System.out.println("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
+        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
+    }
+
+
+}
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/jni-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/jni-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/jni-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/proxy-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/proxy-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/proxy-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json
new file mode 100644
index 0000000..a73b30f
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json
@@ -0,0 +1,981 @@
+[
+{
+  "name":"com.alibaba.fastjson.serializer.ASMSerializer_1_ServiceDefinition",
+  "methods":[{"name":"<init>","parameterTypes":["com.alibaba.fastjson.serializer.SerializeBeanInfo"] }]
+},
+{
+  "name":"com.alibaba.fastjson.serializer.ASMSerializer_2_MethodDefinition",
+  "methods":[{"name":"<init>","parameterTypes":["com.alibaba.fastjson.serializer.SerializeBeanInfo"] }]
+},
+{
+  "name":"com.alibaba.fastjson.serializer.ASMSerializer_3_TypeDefinition",
+  "methods":[{"name":"<init>","parameterTypes":["com.alibaba.fastjson.serializer.SerializeBeanInfo"] }]
+},
+{
+  "name":"com.intellij.rt.execution.application.AppMainV2$Agent",
+  "methods":[{"name":"premain","parameterTypes":["java.lang.String","java.lang.instrument.Instrumentation"] }]
+},
+{
+  "name":"io.netty.bootstrap.ServerBootstrap$1"
+},
+{
+  "name":"io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor",
+  "methods":[
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }
+  ]
+},
+{
+  "name":"io.netty.buffer.AbstractByteBufAllocator",
+  "allDeclaredMethods":true
+},
+{
+  "name":"io.netty.buffer.AbstractReferenceCountedByteBuf",
+  "fields":[{"name":"refCnt", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.channel.ChannelDuplexHandler",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelHandlerAdapter",
+  "methods":[{"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }]
+},
+{
+  "name":"io.netty.channel.ChannelInboundHandlerAdapter",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelInitializer",
+  "methods":[
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelOutboundHandlerAdapter",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "name":"io.netty.channel.DefaultChannelPipeline$HeadContext",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"io.netty.channel.DefaultChannelPipeline$TailContext",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }
+  ]
+},
+{
+  "name":"io.netty.channel.socket.nio.NioServerSocketChannel",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"io.netty.handler.codec.ByteToMessageDecoder",
+  "methods":[
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }
+  ]
+},
+{
+  "name":"io.netty.handler.codec.MessageToByteEncoder",
+  "methods":[{"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }]
+},
+{
+  "name":"io.netty.handler.timeout.IdleStateHandler",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"io.netty.util.ReferenceCountUtil",
+  "allDeclaredMethods":true
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.beans.Transient"
+},
+{
+  "name":"java.io.File",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.io.Serializable",
+  "allPublicMethods":true
+},
+{
+  "name":"java.lang.AutoCloseable"
+},
+{
+  "name":"java.lang.ClassLoader",
+  "methods":[{"name":"defineClass","parameterTypes":["java.lang.String","byte[]","int","int","java.security.ProtectionDomain"] }]
+},
+{
+  "name":"java.lang.Number",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true
+},
+{
+  "name":"java.lang.Object",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true
+},
+{
+  "name":"java.lang.StackTraceElement",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allDeclaredConstructors":true
+},
+{
+  "name":"java.lang.StringBuilder"
+},
+{
+  "name":"java.lang.Thread",
+  "methods":[{"name":"getContextClassLoader","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.Throwable",
+  "fields":[{"name":"detailMessage"}]
+},
+{
+  "name":"java.lang.invoke.CallSite"
+},
+{
+  "name":"java.lang.management.ManagementFactory",
+  "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.management.RuntimeMXBean",
+  "methods":[{"name":"getName","parameterTypes":[] }]
+},
+{
+  "name":"java.math.BigDecimal",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.math.BigInteger",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allDeclaredConstructors":true
+},
+{
+  "name":"java.nio.Bits",
+  "methods":[{"name":"unaligned","parameterTypes":[] }]
+},
+{
+  "name":"java.nio.Buffer",
+  "fields":[{"name":"address", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.nio.DirectByteBuffer",
+  "fields":[{"name":"cleaner", "allowUnsafeAccess":true}],
+  "methods":[{"name":"<init>","parameterTypes":["long","int"] }]
+},
+{
+  "name":"java.nio.file.Path"
+},
+{
+  "name":"java.sql.Clob"
+},
+{
+  "name":"java.sql.Date",
+  "methods":[{"name":"<init>","parameterTypes":["long"] }]
+},
+{
+  "name":"java.sql.Time",
+  "methods":[{"name":"<init>","parameterTypes":["long"] }]
+},
+{
+  "name":"java.sql.Timestamp",
+  "methods":[{"name":"<init>","parameterTypes":["long"] }]
+},
+{
+  "name":"java.time.Duration"
+},
+{
+  "name":"java.time.Instant"
+},
+{
+  "name":"java.time.LocalDate"
+},
+{
+  "name":"java.time.LocalDateTime"
+},
+{
+  "name":"java.time.LocalTime"
+},
+{
+  "name":"java.time.MonthDay"
+},
+{
+  "name":"java.time.OffsetDateTime"
+},
+{
+  "name":"java.time.OffsetTime"
+},
+{
+  "name":"java.time.Period"
+},
+{
+  "name":"java.time.Year"
+},
+{
+  "name":"java.time.YearMonth"
+},
+{
+  "name":"java.time.ZoneId"
+},
+{
+  "name":"java.time.ZoneOffset"
+},
+{
+  "name":"java.time.ZonedDateTime"
+},
+{
+  "name":"java.util.AbstractMap",
+  "allDeclaredMethods":true
+},
+{
+  "name":"java.util.HashMap",
+  "allDeclaredMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"java.util.Map",
+  "allPublicConstructors":true
+},
+{
+  "name":"java.util.function.Function"
+},
+{
+  "name":"java.util.zip.DeflaterInputStream"
+},
+{
+  "name":"javax.management.ObjectName",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"org.apace.dubbo.graalvm.demo.DemoService",
+  "allPublicFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.common.bytecode.Wrapper0",
+  "fields":[
+    {"name":"dmns"}, 
+    {"name":"mns"}, 
+    {"name":"mts0"}, 
+    {"name":"pns"}, 
+    {"name":"pts"}
+  ],
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.config.Environment",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfigurationFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.config.configcenter.nop.NopDynamicConfigurationFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.extension.factory.SpiExtensionFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.infra.support.EnvironmentAdapter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.jcl.JclLoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.log4j2.Log4j2LoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.serialize.hessian2.dubbo.DefaultHessian2FactoryInitializer",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.serialize.hessian2.dubbo.WhitelistHessian2FactoryInitializer",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.ThreadPool$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.cached.CachedThreadPool",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.eager.EagerThreadPool",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.fixed.FixedThreadPool",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.common.threadpool.support.limited.LimitedThreadPool",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.config.AbstractConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractInterfaceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractMethodConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractReferenceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.AbstractServiceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ApplicationConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ConfigCenterConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ConsumerConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.MetadataReportConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.MetricsConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ModuleConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.MonitorConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ProtocolConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ProviderConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.RegistryConfig",
+  "allPublicMethods":true,
+  "fields":[
+    {"name":"accepts"}, 
+    {"name":"address"}, 
+    {"name":"check"}, 
+    {"name":"client"}, 
+    {"name":"cluster"}, 
+    {"name":"dynamic"}, 
+    {"name":"extraKeys"}, 
+    {"name":"file"}, 
+    {"name":"group"}, 
+    {"name":"password"}, 
+    {"name":"port"}, 
+    {"name":"preferred"}, 
+    {"name":"protocol"}, 
+    {"name":"register"}, 
+    {"name":"server"}, 
+    {"name":"session"}, 
+    {"name":"simplified"}, 
+    {"name":"subscribe"}, 
+    {"name":"timeout"}, 
+    {"name":"transporter"}, 
+    {"name":"useAsConfigCenter"}, 
+    {"name":"useAsMetadataCenter"}, 
+    {"name":"username"}, 
+    {"name":"version"}, 
+    {"name":"wait"}, 
+    {"name":"weight"}, 
+    {"name":"zone"}
+  ]
+},
+{
+  "name":"org.apache.dubbo.config.ServiceConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.ServiceConfigBase",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.SslConfig",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.config.context.ConfigManager",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.config.event.listener.LoggingEventListener",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.demo.graalvm.provider.DemoServiceImpl",
+  "methods":[{"name":"sayHello","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"org.apache.dubbo.event.DirectEventDispatcher",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.event.GenericEventListener",
+  "methods":[{"name":"onEvent","parameterTypes":["org.apache.dubbo.event.Event"] }]
+},
+{
+  "name":"org.apache.dubbo.event.ParallelEventDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.builder.ArrayTypeBuilder",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.builder.CollectionTypeBuilder",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.builder.EnumTypeBuilder",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.builder.MapTypeBuilder",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.model.MethodDefinition",
+  "allDeclaredFields":true,
+  "allPublicFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.model.ServiceDefinition",
+  "allDeclaredFields":true,
+  "allPublicFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.metadata.definition.model.TypeDefinition",
+  "allDeclaredFields":true,
+  "allPublicFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.monitor.MetricsService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.monitor.MonitorService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.monitor.support.MetricsServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.monitor.support.MonitorFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.monitor.support.MonitorServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.RegistryFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.RegistryFactoryWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.registry.RegistryFactory"] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.event.listener.LoggingEventListener",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.client.migration.MigrationRuleListener",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.integration.RegistryProtocol",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.multicast.MulticastRegistryFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.registry.zookeeper.ZookeeperRegistryFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.Dispatcher$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.Transporter$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.exchange.codec.ExchangeCodec",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.exchange.support.header.HeaderExchanger",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.telnet.codec.TelnetCodec",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.codec.TransportCodec",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.all.AllDispatcher",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.all2.AllDispatcher2",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.dispatcher.message.MessageOnlyDispatcher",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalDecoder"
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder"
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyServer$1"
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyServerHandler",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"org.apache.dubbo.remoting.transport.netty4.NettyTransporter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.Protocol$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.ProxyFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.ConfiguratorFactory$Adaptive",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.configurator.absent.AbsentConfiguratorFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.configurator.override.OverrideConfiguratorFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.cluster.governance.DefaultGovernanceRuleRepositoryImpl",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.AccessLogFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ActiveLimitFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ClassLoaderFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.CompatibleFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ConsumerContextFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ContextFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.DeprecatedFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.EchoFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ExceptionFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.ExecuteLimitFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.GenericFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.GenericImplFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.TimeoutFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.TokenFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.filter.TpsLimitFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.model.ServiceRepository",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.Protocol"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.Protocol"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.proxy.jdk.JdkProxyFactory",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.dubbo.rpc.ProxyFactory"] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.service.EchoService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.rpc.service.EchoServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.service.GenericService",
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.dubbo.rpc.service.GenericServiceDetector",
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.dubbo.rpc.support.MockProtocol",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.log4j.Category"
+},
+{
+  "name":"org.apache.log4j.CategoryKey"
+},
+{
+  "name":"org.apache.log4j.Logger"
+},
+{
+  "name":"org.apache.log4j.helpers.Loader"
+},
+{
+  "name":"org.apache.zookeeper.ClientCnxnSocketNIO",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.misc.Cleaner",
+  "methods":[{"name":"clean","parameterTypes":[] }]
+},
+{
+  "name":"sun.misc.Unsafe",
+  "allDeclaredMethods":true,
+  "fields":[{"name":"theUnsafe"}],
+  "methods":[
+    {"name":"getAndAddLong","parameterTypes":["java.lang.Object","long","long"] }, 
+    {"name":"getAndSetObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }
+  ]
+},
+{
+  "name":"sun.misc.VM",
+  "methods":[{"name":"maxDirectMemory","parameterTypes":[] }]
+},
+{
+  "name":"sun.nio.ch.SelectorImpl",
+  "fields":[
+    {"name":"publicSelectedKeys"}, 
+    {"name":"selectedKeys"}
+  ]
+},
+{
+  "name":"sun.security.provider.ConfigFile",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+}
+]
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/resource-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/resource-config.json
new file mode 100644
index 0000000..78ace10
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/resource-config.json
@@ -0,0 +1,52 @@
+{
+  "resources":{
+  "includes":[
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.context.FrameworkExt\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.infra.InfraAdapter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.logger.LoggerAdapter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.serialize.hessian2.dubbo.Hessian2FactoryInitializer\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.threadpool.ThreadPool\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.common.threadpool.manager.ExecutorRepository\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.event.EventListener\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.Codec2\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.Dispatcher\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.Transporter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.exchange.Exchanger\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.Filter\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.ProxyFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ConfiguratorFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository\\E"}, 
+    {"pattern":"\\QMETA-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector\\E"}, 
+    {"pattern":"\\QMETA-INF/services/org.apache.dubbo.common.extension.LoadingStrategy\\E"}, 
+    {"pattern":"\\Qjava/io/Serializable.class\\E"}, 
+    {"pattern":"\\Qjava/lang/Class.class\\E"}, 
+    {"pattern":"\\Qjava/lang/IllegalArgumentException.class\\E"}, 
+    {"pattern":"\\Qjava/lang/Object.class\\E"}, 
+    {"pattern":"\\Qjava/lang/String.class\\E"}, 
+    {"pattern":"\\Qjava/lang/StringBuffer.class\\E"}, 
+    {"pattern":"\\Qjava/lang/Throwable.class\\E"}, 
+    {"pattern":"\\Qjava/lang/reflect/InvocationTargetException.class\\E"}, 
+    {"pattern":"\\Qjava/util/Map.class\\E"}, 
+    {"pattern":"\\Qorg/apace/dubbo/graalvm/demo/DemoService.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/common/Version.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/common/bytecode/ClassGenerator$DC.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/common/bytecode/NoSuchMethodException.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/common/bytecode/NoSuchPropertyException.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/common/bytecode/Wrapper.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/remoting/RemotingException.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/remoting/Transporters.class\\E"}, 
+    {"pattern":"\\Qorg/apache/dubbo/remoting/exchange/Exchangers.class\\E"}, 
+    {"pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"}
+  ]},
+  "bundles":[]
+}
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/serialization-config.json b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/serialization-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/serialization-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/dubbo-demo/dubbo-demo-native/pom.xml b/dubbo-demo/dubbo-demo-native/pom.xml
new file mode 100644
index 0000000..844dfa0
--- /dev/null
+++ b/dubbo-demo/dubbo-demo-native/pom.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>dubbo-demo</artifactId>
+        <groupId>org.apache.dubbo</groupId>
+        <version>2.7.12-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-demo-native</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>dubbo-demo-native-consumer</module>
+        <module>dubbo-demo-native-provider</module>
+        <module>dubbo-demo-native-interface</module>
+    </modules>
+
+
+</project>
\ No newline at end of file
diff --git a/dubbo-demo/pom.xml b/dubbo-demo/pom.xml
index e636a23..69052b6 100644
--- a/dubbo-demo/pom.xml
+++ b/dubbo-demo/pom.xml
@@ -35,6 +35,7 @@
         <module>dubbo-demo-xml</module>
         <module>dubbo-demo-annotation</module>
         <module>dubbo-demo-api</module>
+        <module>dubbo-demo-native</module>
     </modules>
 
     <dependencyManagement>
diff --git a/dubbo-graalvm/pom.xml b/dubbo-graalvm/pom.xml
new file mode 100644
index 0000000..91ba85d
--- /dev/null
+++ b/dubbo-graalvm/pom.xml
@@ -0,0 +1,64 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-parent</artifactId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>dubbo-graalvm</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
+
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-common</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-api</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-monitor-api</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-api</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-zookeeper</artifactId>
+            <version>2.7.12-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool$Adaptive.java
new file mode 100644
index 0000000..4ac2f44
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool$Adaptive.java
@@ -0,0 +1,15 @@
+package org.apache.dubbo.common.threadpool;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class ThreadPool$Adaptive implements org.apache.dubbo.common.threadpool.ThreadPool {
+    public java.util.concurrent.Executor getExecutor(org.apache.dubbo.common.URL arg0) {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = url.getParameter("threadpool", "fixed");
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.common.threadpool.ThreadPool) name from url (" + url.toString() + ") use keys([threadpool])");
+        org.apache.dubbo.common.threadpool.ThreadPool extension = (org.apache.dubbo.common.threadpool.ThreadPool) ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.threadpool.ThreadPool.class).getExtension(extName);
+        return extension.getExecutor(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/metadata/report/MetadataReportFactory$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/metadata/report/MetadataReportFactory$Adaptive.java
new file mode 100644
index 0000000..94a8506
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/metadata/report/MetadataReportFactory$Adaptive.java
@@ -0,0 +1,15 @@
+package org.apache.dubbo.metadata.report;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class MetadataReportFactory$Adaptive implements org.apache.dubbo.metadata.report.MetadataReportFactory {
+    public org.apache.dubbo.metadata.report.MetadataReport getMetadataReport(org.apache.dubbo.common.URL arg0) {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = (url.getProtocol() == null ? "redis" : url.getProtocol());
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.metadata.report.MetadataReportFactory) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.metadata.report.MetadataReportFactory extension = (org.apache.dubbo.metadata.report.MetadataReportFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.metadata.report.MetadataReportFactory.class).getExtension(extName);
+        return extension.getMetadataReport(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/monitor/MonitorFactory$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/monitor/MonitorFactory$Adaptive.java
new file mode 100644
index 0000000..6506e3a
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/monitor/MonitorFactory$Adaptive.java
@@ -0,0 +1,12 @@
+package org.apache.dubbo.monitor;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+public class MonitorFactory$Adaptive implements org.apache.dubbo.monitor.MonitorFactory {
+    public org.apache.dubbo.monitor.Monitor getMonitor(org.apache.dubbo.common.URL arg0)  {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = ( url.getProtocol() == null ? "dubbo" : url.getProtocol() );
+        if(extName == null) throw new IllegalStateException("Failed to get extension (org.apache.dubbo.monitor.MonitorFactory) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.monitor.MonitorFactory extension = (org.apache.dubbo.monitor.MonitorFactory)ExtensionLoader.getExtensionLoader(org.apache.dubbo.monitor.MonitorFactory.class).getExtension(extName);
+        return extension.getMonitor(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/registry/RegistryFactory$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/registry/RegistryFactory$Adaptive.java
new file mode 100644
index 0000000..cccf8f5
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/registry/RegistryFactory$Adaptive.java
@@ -0,0 +1,12 @@
+package org.apache.dubbo.registry;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+public class RegistryFactory$Adaptive implements org.apache.dubbo.registry.RegistryFactory {
+    public org.apache.dubbo.registry.Registry getRegistry(org.apache.dubbo.common.URL arg0)  {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = ( url.getProtocol() == null ? "dubbo" : url.getProtocol() );
+        if(extName == null) throw new IllegalStateException("Failed to get extension (org.apache.dubbo.registry.RegistryFactory) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.registry.RegistryFactory extension = (org.apache.dubbo.registry.RegistryFactory)ExtensionLoader.getExtensionLoader(org.apache.dubbo.registry.RegistryFactory.class).getExtension(extName);
+        return extension.getRegistry(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/Dispatcher$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/Dispatcher$Adaptive.java
new file mode 100644
index 0000000..34d028e
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/Dispatcher$Adaptive.java
@@ -0,0 +1,12 @@
+package org.apache.dubbo.remoting;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+public class Dispatcher$Adaptive implements org.apache.dubbo.remoting.Dispatcher {
+    public org.apache.dubbo.remoting.ChannelHandler dispatch(org.apache.dubbo.remoting.ChannelHandler arg0, org.apache.dubbo.common.URL arg1)  {
+        if (arg1 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg1;
+        String extName = url.getParameter("dispatcher", url.getParameter("dispather", url.getParameter("channel.handler", "all")));
+        if(extName == null) throw new IllegalStateException("Failed to get extension (org.apache.dubbo.remoting.Dispatcher) name from url (" + url.toString() + ") use keys([dispatcher, dispather, channel.handler])");
+        org.apache.dubbo.remoting.Dispatcher extension = (org.apache.dubbo.remoting.Dispatcher)ExtensionLoader.getExtensionLoader(org.apache.dubbo.remoting.Dispatcher.class).getExtension(extName);
+        return extension.dispatch(arg0, arg1);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/Transporter$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/Transporter$Adaptive.java
new file mode 100644
index 0000000..d22e2ff
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/Transporter$Adaptive.java
@@ -0,0 +1,25 @@
+package org.apache.dubbo.remoting;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class Transporter$Adaptive implements org.apache.dubbo.remoting.Transporter {
+    public org.apache.dubbo.remoting.RemotingServer bind(org.apache.dubbo.common.URL arg0, org.apache.dubbo.remoting.ChannelHandler arg1) throws org.apache.dubbo.remoting.RemotingException {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = url.getParameter("server", url.getParameter("transporter", "netty"));
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.remoting.Transporter) name from url (" + url.toString() + ") use keys([server, transporter])");
+        org.apache.dubbo.remoting.Transporter extension = (org.apache.dubbo.remoting.Transporter) ExtensionLoader.getExtensionLoader(org.apache.dubbo.remoting.Transporter.class).getExtension(extName);
+        return extension.bind(arg0, arg1);
+    }
+
+    public org.apache.dubbo.remoting.Client connect(org.apache.dubbo.common.URL arg0, org.apache.dubbo.remoting.ChannelHandler arg1) throws org.apache.dubbo.remoting.RemotingException {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = url.getParameter("client", url.getParameter("transporter", "netty"));
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.remoting.Transporter) name from url (" + url.toString() + ") use keys([client, transporter])");
+        org.apache.dubbo.remoting.Transporter extension = (org.apache.dubbo.remoting.Transporter) ExtensionLoader.getExtensionLoader(org.apache.dubbo.remoting.Transporter.class).getExtension(extName);
+        return extension.connect(arg0, arg1);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperTransporter$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperTransporter$Adaptive.java
new file mode 100644
index 0000000..8d20e39
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperTransporter$Adaptive.java
@@ -0,0 +1,15 @@
+package org.apache.dubbo.remoting.zookeeper;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class ZookeeperTransporter$Adaptive implements org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter {
+    public org.apache.dubbo.remoting.zookeeper.ZookeeperClient connect(org.apache.dubbo.common.URL arg0) {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = url.getParameter("client", url.getParameter("transporter", "curator"));
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter) name from url (" + url.toString() + ") use keys([client, transporter])");
+        org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter extension = (org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter) ExtensionLoader.getExtensionLoader(org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter.class).getExtension(extName);
+        return extension.connect(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/Protocol$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/Protocol$Adaptive.java
new file mode 100644
index 0000000..f74973d
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/Protocol$Adaptive.java
@@ -0,0 +1,39 @@
+package org.apache.dubbo.rpc;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class Protocol$Adaptive implements org.apache.dubbo.rpc.Protocol {
+    public org.apache.dubbo.rpc.Exporter export(org.apache.dubbo.rpc.Invoker arg0) throws org.apache.dubbo.rpc.RpcException {
+        if (arg0 == null) throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument == null");
+        if (arg0.getUrl() == null)
+            throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument getUrl() == null");
+        org.apache.dubbo.common.URL url = arg0.getUrl();
+        String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.Protocol) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
+        return extension.export(arg0);
+    }
+
+    public org.apache.dubbo.rpc.Invoker refer(java.lang.Class arg0, org.apache.dubbo.common.URL arg1) throws org.apache.dubbo.rpc.RpcException {
+        if (arg1 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg1;
+        String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.Protocol) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
+        return extension.refer(arg0, arg1);
+    }
+
+    public java.util.List getServers() {
+        throw new UnsupportedOperationException("The method public default java.util.List org.apache.dubbo.rpc.Protocol.getServers() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!");
+    }
+
+    public void destroy() {
+        throw new UnsupportedOperationException("The method public abstract void org.apache.dubbo.rpc.Protocol.destroy() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!");
+    }
+
+    public int getDefaultPort() {
+        throw new UnsupportedOperationException("The method public abstract int org.apache.dubbo.rpc.Protocol.getDefaultPort() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!");
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/ProxyFactory$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/ProxyFactory$Adaptive.java
new file mode 100644
index 0000000..ab3c3e3
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/ProxyFactory$Adaptive.java
@@ -0,0 +1,39 @@
+package org.apache.dubbo.rpc;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class ProxyFactory$Adaptive implements org.apache.dubbo.rpc.ProxyFactory {
+    public java.lang.Object getProxy(org.apache.dubbo.rpc.Invoker arg0) throws org.apache.dubbo.rpc.RpcException {
+        if (arg0 == null) throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument == null");
+        if (arg0.getUrl() == null)
+            throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument getUrl() == null");
+        org.apache.dubbo.common.URL url = arg0.getUrl();
+        String extName = url.getParameter("proxy", "javassist");
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.ProxyFactory) name from url (" + url.toString() + ") use keys([proxy])");
+        org.apache.dubbo.rpc.ProxyFactory extension = (org.apache.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.ProxyFactory.class).getExtension(extName);
+        return extension.getProxy(arg0);
+    }
+
+    public java.lang.Object getProxy(org.apache.dubbo.rpc.Invoker arg0, boolean arg1) throws org.apache.dubbo.rpc.RpcException {
+        if (arg0 == null) throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument == null");
+        if (arg0.getUrl() == null)
+            throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument getUrl() == null");
+        org.apache.dubbo.common.URL url = arg0.getUrl();
+        String extName = url.getParameter("proxy", "javassist");
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.ProxyFactory) name from url (" + url.toString() + ") use keys([proxy])");
+        org.apache.dubbo.rpc.ProxyFactory extension = (org.apache.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.ProxyFactory.class).getExtension(extName);
+        return extension.getProxy(arg0, arg1);
+    }
+
+    public org.apache.dubbo.rpc.Invoker getInvoker(java.lang.Object arg0, java.lang.Class arg1, org.apache.dubbo.common.URL arg2) throws org.apache.dubbo.rpc.RpcException {
+        if (arg2 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg2;
+        String extName = url.getParameter("proxy", "javassist");
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.ProxyFactory) name from url (" + url.toString() + ") use keys([proxy])");
+        org.apache.dubbo.rpc.ProxyFactory extension = (org.apache.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.ProxyFactory.class).getExtension(extName);
+        return extension.getInvoker(arg0, arg1, arg2);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/Cluster$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/Cluster$Adaptive.java
new file mode 100644
index 0000000..60e3765
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/Cluster$Adaptive.java
@@ -0,0 +1,19 @@
+package org.apache.dubbo.rpc.cluster;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+public class Cluster$Adaptive implements org.apache.dubbo.rpc.cluster.Cluster {
+    public org.apache.dubbo.rpc.cluster.Cluster getCluster(java.lang.String arg0)  {
+        throw new UnsupportedOperationException("The method public static org.apache.dubbo.rpc.cluster.Cluster org.apache.dubbo.rpc.cluster.Cluster.getCluster(java.lang.String) of interface org.apache.dubbo.rpc.cluster.Cluster is not adaptive method!");
+    }
+    public org.apache.dubbo.rpc.cluster.Cluster getCluster(java.lang.String arg0, boolean arg1)  {
+        throw new UnsupportedOperationException("The method public static org.apache.dubbo.rpc.cluster.Cluster org.apache.dubbo.rpc.cluster.Cluster.getCluster(java.lang.String,boolean) of interface org.apache.dubbo.rpc.cluster.Cluster is not adaptive method!");
+    }
+    public org.apache.dubbo.rpc.Invoker join(org.apache.dubbo.rpc.cluster.Directory arg0) throws org.apache.dubbo.rpc.RpcException {
+        if (arg0 == null) throw new IllegalArgumentException("org.apache.dubbo.rpc.cluster.Directory argument == null");
+        if (arg0.getUrl() == null) throw new IllegalArgumentException("org.apache.dubbo.rpc.cluster.Directory argument getUrl() == null");
+        org.apache.dubbo.common.URL url = arg0.getUrl();
+        String extName = url.getParameter("cluster", "failover");
+        if(extName == null) throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.cluster.Cluster) name from url (" + url.toString() + ") use keys([cluster])");
+        org.apache.dubbo.rpc.cluster.Cluster extension = (org.apache.dubbo.rpc.cluster.Cluster)ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.cluster.Cluster.class).getExtension(extName);
+        return extension.join(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/ConfiguratorFactory$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/ConfiguratorFactory$Adaptive.java
new file mode 100644
index 0000000..6ca6033
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/ConfiguratorFactory$Adaptive.java
@@ -0,0 +1,15 @@
+package org.apache.dubbo.rpc.cluster;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class ConfiguratorFactory$Adaptive implements org.apache.dubbo.rpc.cluster.ConfiguratorFactory {
+    public org.apache.dubbo.rpc.cluster.Configurator getConfigurator(org.apache.dubbo.common.URL arg0) {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = url.getProtocol();
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.cluster.ConfiguratorFactory) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.rpc.cluster.ConfiguratorFactory extension = (org.apache.dubbo.rpc.cluster.ConfiguratorFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.cluster.ConfiguratorFactory.class).getExtension(extName);
+        return extension.getConfigurator(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/RouterFactory$Adaptive.java b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/RouterFactory$Adaptive.java
new file mode 100644
index 0000000..e72522e
--- /dev/null
+++ b/dubbo-graalvm/src/main/java/org/apache/dubbo/rpc/cluster/RouterFactory$Adaptive.java
@@ -0,0 +1,15 @@
+package org.apache.dubbo.rpc.cluster;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+public class RouterFactory$Adaptive implements org.apache.dubbo.rpc.cluster.RouterFactory {
+    public org.apache.dubbo.rpc.cluster.Router getRouter(org.apache.dubbo.common.URL arg0) {
+        if (arg0 == null) throw new IllegalArgumentException("url == null");
+        org.apache.dubbo.common.URL url = arg0;
+        String extName = url.getProtocol();
+        if (extName == null)
+            throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.cluster.RouterFactory) name from url (" + url.toString() + ") use keys([protocol])");
+        org.apache.dubbo.rpc.cluster.RouterFactory extension = (org.apache.dubbo.rpc.cluster.RouterFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.cluster.RouterFactory.class).getExtension(extName);
+        return extension.getRouter(arg0);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
index 6f8d6d5..3f84cf8 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
@@ -31,6 +31,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.support.ProtocolUtils;
 
 import com.alibaba.fastjson.JSON;
+import com.google.gson.Gson;
 
 import java.util.Comparator;
 import java.util.Map;
@@ -172,7 +173,7 @@ public class InMemoryWritableMetadataService implements WritableMetadataService
                 if (StringUtils.isNotEmpty(interfaceName)) {
                     Class interfaceClass = Class.forName(interfaceName);
                     ServiceDefinition serviceDefinition = ServiceDefinitionBuilder.build(interfaceClass);
-                    String data = JSON.toJSONString(serviceDefinition);
+                    String data = new Gson().toJson(serviceDefinition);
                     serviceDefinitions.put(providerUrl.getServiceKey(), data);
                     return;
                 }
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java
index 39b0992..3d12608 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java
@@ -25,9 +25,9 @@ import org.apache.dubbo.rpc.service.Destroyable;
 import org.apache.dubbo.rpc.service.EchoService;
 import org.apache.dubbo.rpc.service.GenericService;
 
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.List;
 
 import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
 import static org.apache.dubbo.rpc.Constants.INTERFACES;
@@ -47,7 +47,7 @@ public abstract class AbstractProxyFactory implements ProxyFactory {
 
     @Override
     public <T> T getProxy(Invoker<T> invoker, boolean generic) throws RpcException {
-        Set<Class<?>> interfaces = new HashSet<>();
+        List<Class<?>> interfaces = new ArrayList<>();
 
         String config = invoker.getUrl().getParameter(INTERFACES);
         if (config != null && config.length() > 0) {
diff --git a/pom.xml b/pom.xml
index 407b226..3939983 100644
--- a/pom.xml
+++ b/pom.xml
@@ -152,6 +152,7 @@
         <module>dubbo-metadata</module>
         <module>dubbo-build-tools</module>
         <module>dubbo-spring-boot</module>
+        <module>dubbo-graalvm</module>
     </modules>
 
     <dependencyManagement>