dw怎样做网站切换,偃师网站制作,wordpress用户注册卡慢,广州注册公司流程和费用背景
在使用 Quarkus 等框架时#xff0c;反射机制可能是我们剥离spring框架之后做native包需要的解决问题。 首先先了解讨论为什么原生包#xff08;native image#xff09;不支持传统的反射机制呢#xff1f;扩展一下知识点#xff0c;两者之间的区别。
反射机制反射机制可能是我们剥离spring框架之后做native包需要的解决问题。 首先先了解讨论为什么原生包native image不支持传统的反射机制呢扩展一下知识点两者之间的区别。
反射机制反射允许 Java 程序在运行时动态地发现和使用类、方法和字段。这种动态性带来了极大的灵活性但也有一些缺点如性能开销和安全问题。
原生包native imageGraalVM 提供了一种将 Java 应用程序编译为原生可执行文件的能力这种方式能够显著提高启动速度和减少内存占用。这是因为原生包在编译时进行了大量的优化和提前计算而不是依赖运行时的动态特性。
综上我们在编译期即使使用了反射机制也不会影响我们代码正常运行换言之只要我们不制作native镜像包都不会影响我们的使用。
那我们解释一下为什么会不支持呢。 原生包的构建依赖静态分析分析应用程序的全部代码路径。这种方法需要知道所有可能的类、方法和字段引用。 编译时所有可能被使用的代码都必须是已知的。反射机制的动态性使得在编译时无法确定哪些类和成员会在运行时被访问。 生成原生包时GraalVM 会去除所有未使用的类和方法以减少包的大小。反射需要运行时的类型信息和元数据而这些信息在编译期间可能被删除导致运行时无法通过反射机制访问。 反射机制需要大量的元数据来支持运行时动态查找这会增加内存占用。而原生包的一个主要优势就是减少内存占用因此这两者是矛盾的。
针对上面的扩展相信大家应该会进一步了解了原生包的机制了吧下面开启今天的主题RegisterForReflection
RegisterForReflection
为了在原生包中使用反射GraalVM 提供了一些解决方案主要是通过显式注册反射信息。 RegisterForReflection注解用于显式声明哪些类需要在运行时使用反射。这些信息在编译时被收集并保存在配置文件中以便在生成原生包时包含必要的元数据确保在原生镜像中能够正确处理反射操作。
实践
语法示例
方式一使用 RegisterForReflection 注解
import io.quarkus.runtime.annotations.RegisterForReflection;RegisterForReflection
public class MyClass {private String name;private int age;// Constructors, Getters, and Setters
}
方式二配置文件注册反射信息 除了使用注解还可以通过配置文件注册反射信息。这在处理第三方库或无法修改源代码的情况下非常有用。
在META-INF/native-image/reflect-config.json文件中添加如下配置
[{name: com.example.MyClass,allDeclaredFields: true,allDeclaredMethods: true}
]
构建native镜像
dockerfile.native
FROM quay.io/quarkus/ubi-quarkus-native-image:22.3-java11 AS buildWORKDIR /workspace
COPY . .RUN ./mvnw package -Pnative -Dquarkus.native.container-buildtrue# Stage 2: Create the minimal runtime image
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6WORKDIR /work/
RUN chown 1001 /work \ chmod grwX /work \ chown 1001:root /workCOPY --frombuild /workspace/target/*-runner /work/applicationEXPOSE 8080
USER 1001CMD [./application, -Dquarkus.http.host0.0.0.0]
构建命令docker build -f src/main/docker/Dockerfile.native -t quarkus/getting-started .运行命令docker run -i --rm -p 8080:8080 quarkus/getting-started