你真的懂@Retention吗?一文看懂Java注解生命周期与反射调用关系

如何帮助您更好地理解Java中@Retention(RetentionPolicy.RUNTIME)的用法和实际应用 在Java中,@Retention是一个元注解(meta-annotation),用于定义注解的保留策略。注解可以在源代码、编译时和运行时保留,@Retention用于指定注解的保留策略。@Retention(RetentionPolicy.RUNTIME)表示注解将在运行时保留,允许通过反射获取注解信息。 在接下来的详解中,我将为您提供一个完整的示例和代码,以帮助您更好地理解Java中@Retention(RetentionPolicy.RUNTIME)的用法和实际应用。 阅读详情

第一章:你真的懂@Retention吗?

Java 注解(Annotation)自 JDK 1.5 引入以来,已成为现代开发中不可或缺的一部分。而 `@Retention` 注解正是决定其他注解“生命周期”的关键元注解之一。它控制着注解信息在源码、编译后的类文件以及运行时是否保留。

三种保留策略

`@Retention` 接受一个 `RetentionPolicy` 枚举值,定义了注解的存活阶段:
  • SOURCE:仅保留在源码中,编译时被丢弃,常用于编译器检查,如 @Override
  • CLASS:注解记录在 class 文件中,但 JVM 运行时忽略,适用于一些构建工具处理
  • RUNTIME:注解在运行时可通过反射读取,是实现框架功能(如 Spring、JPA)的基础

代码示例


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

// 该注解将在运行时保留,可通过反射获取
@Retention(RetentionPolicy.RUNTIME)
public @interface DebugInfo {
    String author();
    String date();
}
上述代码定义了一个自定义注解 `@DebugInfo`,使用 `@Retention(RUNTIME)` 确保其在程序运行期间可用。例如,在反射中可调用 method.getAnnotation(DebugInfo.class) 获取注解实例。

实际应用场景对比

场景推荐 Retention 策略说明
编译期校验SOURCE如 Lint 工具使用的注解,无需进入运行时
字节码处理CLASSAPT 或字节码增强工具使用,如 Dagger
反射调用RUNTIMESpring Bean 扫描、JPA 映射等依赖运行时读取
正确选择 `@Retention` 策略不仅影响性能,还决定了注解能否在目标阶段生效。忽视这一点可能导致注解“看似正确却无法工作”的问题。

第二章:深入理解注解的保留策略

2.1 SOURCE、CLASS与RUNTIME三种RetentionPolicy解析

Java注解的生命周期由`RetentionPolicy`枚举控制,决定了注解在哪个阶段可见。共有三种策略:SOURCE、CLASS和RUNTIME。
生命周期阶段说明
  • SOURCE:仅保留在源码阶段,编译时被丢弃,常用于编译期检查,如@Override。
  • CLASS:保留在字节码文件中,但JVM运行时不会加载,适用于一些构建工具处理。
  • RUNTIME:保留到运行期,可通过反射读取,是实现框架功能的核心机制。
代码示例与分析
@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeAnnotation {
    String value();
}
该注解在运行时可通过Class.getAnnotation()获取,广泛应用于Spring、JUnit等框架中,支持动态行为配置。而使用RetentionPolicy.SOURCE的注解不占用运行时资源,提升性能。

2.2 编译期处理与.class文件中的注解存在性验证

Java 注解在编译期的行为取决于其声明的保留策略(Retention Policy)。通过 `@Retention` 注解可指定注解信息保留至源码、编译时或运行时。
注解保留策略类型
  • SOURCE:仅保留在源码中,编译后不进入字节码
  • CLASS:保留至字节码文件,但JVM运行时不加载
  • RUNTIME:保留至运行期,可通过反射访问
验证.class文件中的注解存在性
以如下注解为例:
@Retention(RetentionPolicy.CLASS)
public @interface CompileAnnotation {
    String value();
}
该注解会在编译后写入 `.class` 文件的属性表中(如 `RuntimeVisibleAnnotations` 或 `RuntimeInvisibleAnnotations`),但无法通过反射获取。需使用 `javap -v MyClass.class` 查看字节码内容来确认其存在。
保留策略源码可见.class文件存在运行时可反射
SOURCE是否否
CLASS是是否
RUNTIME是是是

2.3 运行时保留注解的字节码层面分析

Java 注解在编译后是否保留,取决于其声明的 `RetentionPolicy`。当注解使用 `@Retention(RetentionPolicy.RUNTIME)` 时,编译器会将其信息保留在 class 文件的 `RuntimeVisibleAnnotations` 属性中,供运行时通过反射访问。
字节码中的注解结构
JVM 在类文件的属性表中为运行时可见注解维护专门结构。例如,以下注解:
@Retention(RetentionPolicy.RUNTIME)
public @interface Monitor {
    String value();
}
应用于方法后,会在该方法的 `RuntimeVisibleAnnotations` 属性中生成对应的 annotation 结构体,包含注解类型索引和成员值对。
反射调用时的解析流程
虚拟机在执行 `Method.getAnnotation()` 时,会解析该方法的属性表,定位到 `RuntimeVisibleAnnotations`,然后根据注解类型匹配并构造出相应的注解实例返回。这一过程发生在运行期,不依赖源码存在。
属性名称作用
RuntimeVisibleAnnotations存储运行时可访问的注解数据
RuntimeInvisibleAnnotations仅保留在编译期,运行时不可见

2.4 不同保留策略对性能与内存的影响对比

在时间序列数据库中,数据保留策略直接影响系统性能与内存占用。合理的策略能在资源消耗与数据可用性之间取得平衡。
常见保留策略类型
  • 无限保留:所有数据永久保存,适合审计场景,但内存和磁盘压力大;
  • 固定周期删除:如仅保留最近7天数据,降低存储开销;
  • 分级归档:热数据保留在内存,冷数据转入磁盘或对象存储。
性能与内存对比分析
策略类型写入吞吐查询延迟内存占用
无限保留低高极高
固定周期高低中等
分级归档较高波动(依热度)低至中
代码示例:配置保留策略(Prometheus)

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

# 设置数据保留时间为7天
storage:
  tsdb:
    retention.time: 7d
该配置将时间序列数据保留期限设为7天,超过此周期的数据自动清理,显著降低内存和磁盘使用量,同时提升查询效率。参数retention.time支持d(天)、h(小时)、w(周)单位,灵活适配业务需求。

2.5 自定义注解中Retention策略的选择最佳实践

在Java自定义注解设计中,RetentionPolicy的选择直接影响注解的生命周期与使用场景。合理选择策略可提升性能并满足功能需求。
三种保留策略对比
  • SOURCE:仅保留在源码阶段,编译时丢弃,适用于编译期检查(如@Override)
  • CLASS:保留到字节码文件,但JVM运行时不可见,适用于AOP织入等字节码处理
  • RUNTIME:运行时可通过反射访问,适用于动态行为控制(如权限校验)
推荐实践
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
    String value() default "INFO";
}
上述注解需在运行时通过反射读取,因此必须使用RUNTIME。若仅用于静态分析,则应选用SOURCE以减少元数据开销。
使用场景推荐策略
反射调用RUNTIME
编译器检查SOURCE
字节码增强CLASS

第三章:注解生命周期与Java编译器行为

3.1 注解在源码阶段的作用与APT处理机制

注解(Annotation)在Java源码阶段主要用于元数据标注,为编译器、开发工具或框架提供额外信息。它们不会直接影响程序逻辑,但可触发特定的编译时行为。
APT处理流程概述
APT(Annotation Processing Tool)是Javac内置的注解处理工具,能在编译期扫描并处理源码中的注解,生成辅助代码或校验逻辑。
  1. 源码中声明注解
  2. Javac启动APT,加载注册的处理器
  3. 处理器匹配目标注解并执行逻辑
  4. 生成新的Java文件并加入编译流程
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Builder {
    String prefix() default "build";
}
上述注解仅保留在源码阶段,供APT识别类并生成构建器方法。参数prefix定义方法名前缀,默认为"build",提升代码生成灵活性。

3.2 CLASS级别注解如何被类加载器忽略

Java 类加载器在加载字节码时,仅关注类的结构和方法实现,不会处理 CLASS级别注解,除非这些注解被标记为 @Retention(RetentionPolicy.RUNTIME)。
注解保留策略的影响
  • SOURCE:仅保留在源码阶段,编译后即丢弃;
  • CLASS:保留在字节码文件中,但JVM加载时不加载;
  • RUNTIME:运行时可通过反射读取。
代码示例与分析
@Retention(RetentionPolicy.CLASS)
public @interface BuildOnly {
    String value();
}
该注解在编译后存在于 .class 文件,但类加载器解析类时会忽略它,无法通过 Class.getAnnotations() 获取。只有使用 ASM 等字节码工具在类加载前扫描才能读取其信息。这种机制减轻了运行时负担,同时支持构建期处理。

3.3 RUNTIME注解从编译到运行时的完整轨迹追踪

RUNTIME注解在Java中具有持久性,其生命周期贯穿编译与运行时阶段。编译器将注解信息保留在class文件的`RuntimeVisibleAnnotations`属性中,供JVM在运行时通过反射机制读取。
注解的保留策略与字节码存储
使用`@Retention(RetentionPolicy.RUNTIME)`声明的注解会被写入class文件,成为元数据的一部分。JVM加载类时,这些数据被载入方法区,可通过`Class.getAnnotation()`访问。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TraceExecution { }

// 使用示例
public class Service {
    @TraceExecution
    public void processData() { }
}
上述代码中,TraceExecution注解在编译后以属性形式存入processData的方法结构中,JVM可在运行时解析该标记用于AOP或监控。
运行时反射调用流程
  • 类加载器加载类并解析注解元数据
  • 反射API(如isAnnotationPresent)查询方法上的注解
  • 获取注解实例并提取配置参数
  • 执行对应逻辑(如日志记录、权限校验)

第四章:反射调用中RUNTIME注解的实际应用

4.1 通过反射读取类、方法、字段上的注解实例

在Java中,反射机制允许程序在运行时动态获取类、方法和字段的元数据,包括其上的注解信息。通过`Class`、`Method`和`Field`对象的`getAnnotation()`或`getAnnotations()`方法,可以读取标注在对应元素上的注解。
注解与反射结合的基本流程
  • 定义自定义注解,使用`@Retention(RetentionPolicy.RUNTIME)`确保注解保留在字节码中
  • 将注解应用于类、方法或字段
  • 通过反射获取对应的Class、Method或Field对象
  • 调用相关方法提取注解值
@Retention(RetentionPolicy.RUNTIME)
@interface Author {
    String name();
    int year();
}

@Author(name = "Alice", year = 2023)
class SampleClass {
    @Author(name = "Bob", year = 2024)
    private String data;
}

// 反射读取类注解
Class<?> clazz = SampleClass.class;
Author classAnno = clazz.getAnnotation(Author.class);
System.out.println(classAnno.name() + ", " + classAnno.year());
上述代码首先定义了一个可在运行时读取的`Author`注解,并将其应用于类和字段。通过`getAnnotation()`方法,程序成功提取了类级别的注解信息,输出结果为“Alice, 2023”。该机制广泛应用于框架开发中,如ORM映射、依赖注入等场景。

4.2 基于注解的依赖注入框架核心实现原理演示

依赖注入(DI)框架通过注解自动装配对象依赖,减少手动new操作。其核心在于类路径扫描与反射机制。
注解定义与使用
定义一个简单的注入注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Inject {
}
该注解标记字段,运行时通过反射识别并注入实例。
核心处理流程
框架启动时扫描指定包下的类,识别被管理的组件。对每个包含注入字段的类,创建实例后遍历字段:
  • 检查字段是否标注 @Inject
  • 获取字段类型,从容器中查找对应实例
  • 使用 setAccessible(true) 并通过 set() 方法赋值
依赖容器管理
维护一个 Class 到实例的映射表,确保相同类型返回同一实例(单例模式),实现依赖共享与生命周期统一控制。

4.3 利用反射+RUNTIME注解实现运行时校验机制

在Java应用中,通过结合反射与RUNTIME保留策略的注解,可实现灵活的运行时数据校验。定义注解时指定`@Retention(RetentionPolicy.RUNTIME)`,使其可在程序运行期间被读取。
自定义校验注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface NotNull {
    String message() default "字段不能为空";
}
该注解用于标记必须非空的字段,保留至运行期以便反射访问。
反射驱动校验逻辑
使用反射获取对象字段及其注解,动态判断并执行校验:
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
    if (field.isAnnotationPresent(NotNull.class)) {
        field.setAccessible(true);
        if (field.get(obj) == null) {
            throw new IllegalArgumentException(field.getName() + " is null");
        }
    }
}
通过遍历字段,检查是否存在`@NotNull`注解,并利用反射读取值进行校验,提升代码通用性与可维护性。

4.4 动态代理结合注解构建AOP简易框架

在Java中,利用动态代理与自定义注解可实现轻量级AOP框架,实现在方法执行前后织入横切逻辑。
自定义注解定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecution {
    String value() default "";
}
该注解用于标记需要记录执行时间的方法,通过反射在代理中识别并处理。
动态代理逻辑实现
  • 代理对象通过InvocationHandler拦截目标方法调用
  • 利用反射判断方法是否标注@LogExecution
  • 在方法执行前后插入日志或监控逻辑
Object invoke(Object proxy, Method method, Object[] args) {
    if (method.isAnnotationPresent(LogExecution.class)) {
        System.out.println("开始执行: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("执行结束: " + method.getName());
        return result;
    }
    return method.invoke(target, args);
}
上述代码展示了在方法调用前后打印日志的核心逻辑,实现了基础的AOP功能。

第五章:总结与常见误区剖析

忽视连接池配置导致性能瓶颈
在高并发服务中,数据库连接管理至关重要。未合理配置连接池会导致资源耗尽或响应延迟。以下是一个典型的 Go 应用中使用 sql.DB 的配置示例:

db.SetMaxOpenConns(50)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(time.Hour)
生产环境中曾出现因最大连接数设为 5 导致请求排队超时,调整至 50 后 QPS 提升三倍。
过度依赖 ORM 忽略 SQL 优化
开发者常误认为 ORM 能完全替代手写 SQL,但在复杂查询场景下生成的语句效率低下。例如,N+1 查询问题频繁出现在关联加载中:
  • 错误做法:循环中逐条查询关联数据
  • 正确做法:预加载(Eager Loading)或使用 JOIN 手动优化
  • 实战建议:通过 EXPLAIN 分析执行计划,定位全表扫描
日志级别设置不当影响排查效率
环境推荐日志级别原因
开发DEBUG便于追踪流程细节
生产ERROR 或 WARN避免 I/O 过载和敏感信息泄露
某金融系统因生产环境开启 TRACE 级别,日志量日增 200GB,引发磁盘告警。
异步任务丢失未启用持久化
使用消息队列时,若未开启持久化且消费者崩溃,任务将永久丢失。应确保:
  1. 消息标记为持久化(durable queue)
  2. 消费者处理完成后显式 ACK
  3. 配置死信队列捕获异常消息
【Java -- 基础】深入探索 -- 注解(Annotation) 在 Java 中,注解(Annotation)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘。 阅读详情

相关推荐

注解:认识注解、注解的分类、注解的生命周期、自定义注解及反射调用、为注解添加属性

-------android培训、Java培训、期待与您交流!------- 1  认识注解(Annotation) 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。 以后,javac编译器、开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。 注解可以加在包,类,字段,方法,方法的参数以及

Rockray 6532

关于java注解的一些总结

最近在项目中用到了注解,如以下:@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface NeedLogin { }这是一个校验登录状态的注解。首先看上面两个元注解@Retention和@Target@Retention表示注解的生命周期,有三种类型:1、RetentionPolicy.SO...

qq_34093116的博客 631

Java:注解和反射

文章目录 学习视频来自于:秦疆(遇见狂神说)Bilibili地址 他的自学网站:kuangstudy 唯有热爱,能抵岁月漫长

希望有点用 2813

@Retention注解详解

一、介绍: @Retention是用来修饰注解的,注解的注解,也称为元注解 二、作用: @Retention修饰注解,用来表示注解的生命周期,生命周期的长短取决于@Retention的属性RetentionPolicy指定的值,例如@Retention(RetentionPolicy.RUNTIME) 取值 描述 作用范围 使用场景 RetentionPolicy.SOURCE 表示注解只保留在源文件,当java文件编译成class文件,就会消失 源文件 只是做一些检查性的操作,,比如 @

weixin_42403127的博客 2万+

Java 元注解 @Retention 与 @Target 实战:3种生命周期与10种目标类型详解

本文深入解析Java元注解@Retention与@Target的实战应用,详细介绍了3种生命周期策略(SOURCE、CLASS、RUNTIME)和10种目标类型(如TYPE、METHOD、FIELD等),并通过代码示例展示如何自定义注解。掌握这些核心元注解的使用方法,能够帮助开发者更高效地进行框架开发和代码优化。

weixin_34038293的博客 330

YOLOv8实例分割实战:从LabelMe标注到模型训练全流程(附完整代码)

本文详细介绍了YOLOv8实例分割的完整实战流程,涵盖从使用LabelMe进行数据标注、格式转换,到构建数据集、配置参数并完成模型训练的全过程。文章提供了详尽的代码示例和常见问题解决方案,旨在帮助开发者高效掌握YOLOv8实例分割技术,快速应用于实际项目。

java5的博客 815

你了解过Java注解中的@Retention(RetentionPolicy.RUNTIME)的作用吗?

在”main”方法中,我们通过反射获取”AnnotationExample”类中的所有方法,并判断是否存在”MyAnnotation”注解。具体来说,它定义了被注解的元素的保留策略,即注解在运行时仍然有效。显然,这里可以打印出Hello,这是因为我们在”myMethod”方法上使用了@MyAnnotation(“Hello”)注解,并在运行时通过反射获取到了该注解。通过javap命令我们查看字节码文件的时候,RUNTIME策略的注解是被保留的,其实也就说明了,这个策略一个重要的作用,那就是反射。

m0_56642224的博客 4626

通俗易懂的图解二叉搜索树、AVL树和红黑树

搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。 那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。 显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。 但是数组并不便于插入和删除,链表便成为了最好的选择。 既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。 二叉搜索树的性质为: 若左子树不为空,则左子树上所有节点值都小于根结点值;

暗色光的博客 758

JAVA中元注解(@Retention、@Target)

java复制// 仅保留在源码中(编译后被丢弃)// 保留在字节码中(默认策略)// 保留在运行时(可通过反射获取)java复制// 仅允许应用在方法上java复制// 仅允许应用在方法上// 保留在运行时(可通过反射获取)// 注解信息包含在Javadoc中// 方法描述String author() default "未知";// 作者// 版本号决定注解的生命周期,直接影响其在编译、运行阶段的可见性。常见用途:SOURCE。

zjw541806的博客 1858

地平线天工开物AI开发平台实战:从量化训练到模型部署的完整指南

本文提供了地平线天工开物(OpenExplorer)AI开发平台的实战指南,详细解析了从量化训练到模型部署的完整流程。文章重点对比了量化感知训练(QAT)与训练后量化(PTQ)两条核心路径的优劣与适用场景,并分享了图像分类模型PTQ部署的实战经验与常见问题调试技巧,旨在帮助开发者高效地将AI模型部署到地平线AI芯片上。

weixin_29046035的博客 456

LabVIEW与MySQL的连接:软件下载与安装至UDL文件创建全过程

依据个人经验编辑的十分完备的使用教程

tiaowudexiaoyu的博客 5574

@Retention注解作用

@Retention作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中.从注释上看:source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期runtime:注解不仅被保存到class文件中,jvm加载class文件之...

m0_37840000的博客 6万+

Unity URP管线下的Highlight Plus插件,从导入到实现物体高亮的保姆级避坑指南

本文详细解析了在Unity URP管线中使用Highlight Plus插件实现物体高亮的完整流程与常见问题解决方案。从URP环境配置、插件导入避坑到相机设置优化,提供了一套完整的保姆级指南,帮助开发者高效解决高亮效果不显示等典型问题,并包含移动端性能优化与复杂场景管理的高级技巧。

weixin_27379781的博客 408

Java中注解与反射的详细介绍

Object relationship Mapping -->对象关系映射。

楠寻寻的博客 1489

做形态学方法的团队_“设计形态学”与“第三自然”

文/邱松(清华大学 美术学院)摘要:“设计形态学”是基于“形态学”研究的设计基础学科。“形态”既是该学科研究的主体,又是与其它学科相连接的“纽带”。实际上,不管是供养我们的地球家园,还是神秘莫测的浩瀚宇宙,均由数量纷繁、千姿百态的“形态”构筑而成。形态通常被分成两大类:一类是源于“第一自然”的“自然形态”;另一类是来自“第二自然”的“人造形态”。而这两类形态正是“设计形态学”研究的两条...

weixin_31548723的博客 2683

AI系统架构原理与代码实战案例讲解

人工智能的概念可以追溯到上世纪50年代,图灵测试的提出标志着人工智能作为一门学科的诞生。早期的研究主要集中在符号推理、专家系统等领域,取得了一些突破,例如机器定理证明、西洋跳棋程序等。上世纪80年代,随着专家系统的兴起,人工智能进入了一个黄金时期。专家系统通过模拟人类专家的知识和经验进行推理和决策,在医疗诊断、故障诊断等领域取得了成功应用。进入90年代,由于计算能力的限制和数据量的不足,人工智能的发展陷入低谷。近年来,随着深度学习技术的突破、大数据的兴起以及计算能力的提升,人工智能迎来了第三次发展浪潮,在图

AI天才研究院 1794

Java 注解与反射(超详细!!!)

**反射**(Reflection)是一种 Java 程序**运行期间**的**动态**技术,可以在**运行时**(runtime)检査、修改其自身结构或行为。通过反射,程序可以访问、检测和修改它自己的类、对象、方法、属性等成员

m0_73494933的博客 1318

【AI 智能体】Windows 环境 Hermes Agent(爱马仕)安装详细过程

Windows 环境 Hermes Agent(爱马仕)安装详细过程

congge_study的博客 1829

java注解与反射学习总结

1.注解 1.1什么是注解? ◆Annotation是从JDK5.0开始弓|入的新技术. Annotation的作用 : 不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如:编译器等)读取. ◆Annotation的格式: 注解是以"@注释名"在代码中存在的,还可以添加一-些参数值,例 如:@SuppressWarnings(value=“unchecked”) ◆Annotation在哪里使用? 可以附加在package , cla

qq_41784749的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

whisper-small八大量化版本对比:int8、uint8、fp16、q4、bnb4怎么选体积与速度的平衡点

whisper-small 是面向 Transformers.js 封装的 Whisper small 语音识别模型 ONNX 版本,`onnx/` 目录中提供了 fp32、fp16、int8、uint8、quantized、q4、q4f16、bnb4 共 **8 种精度版本**。本文将体积、速度、精度三者一次对比清楚,并给出"浏览器用哪个、服务器用哪个、弱网用哪个"的选型策略,帮你快速找到体积与

gitblog_00323的博客 813

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

一文看懂注解与反射

一文讲解java中的注解与反射

zhangkai__的博客 188

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Java元注解】@Target与@Retention:自定义注解的精准定位与生命周期管理

本文深入解析Java元注解@Target与@Retention的核心作用,指导开发者精准控制自定义注解的作用目标与生命周期。通过实战案例演示如何组合使用这两个元注解,并分享常见问题排查与性能优化技巧,帮助提升Java注解开发效率。

weixin_34221276的博客 377

Java 元注解详解:@Target、@Retention、@Documented、@Inherited 区别与使用场景

元注解就是用来描述 “注解自身行为” 的注解。注解用于哪里?(类?方法?字段?注解保留到什么时候?(源码?class?运行时?注解是否会被文档工具收录?注解是否可以被子类继承?这些都是由元注解定义的。元注解作用常见用途@Target限定注解能用在哪里方法注解、类注解、字段注解@Retention决定注解生命周期RUNTIME:AOP、反射最常用是否加入 JavadocAPI 文档友好@Inherited子类是否继承类上的注解。

Knight 1215

【Java】Java元注解

Java中的元注解@Target和@Retention用于定义自定义注解的使用规则和行为。@Target指定注解可以应用的场景,如方法、类或字段,而@Retention则决定注解的生命周期,如是否在运行时可用。通过反射机制,可以在运行时读取注解信息,并根据注解内容动态调整程序行为。这种结合反射和注解的方式广泛应用于AOP、依赖注入、ORM框架等场景,实现日志记录、事务管理、权限控制等功能。

weixin_44624036的博客 1084

java反射和java注解

反射 框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 反射:将java代码的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,这就是java的反射 机制,如下图。 反射的好处: 可以在程序运行过程中,操作这些对象。 可以解耦,提高程序的可扩展性。 获取class对象的方式 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 // 通过指定的字符串路径获取 // 多用于配置文件

梦想是很难很难的,所以先勇敢一点 1833
上一篇: Swagger3分组配置不生效?常见问题与解决方案,一篇搞定
下一篇: 你真的会用BCrypt吗?Spring Security中强度参数的4个致命误区
InstrFun
博客等级 码龄1年 142粉丝 1990原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值