Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring的编译时和运行时注释之间的差异_Java_Spring_Spring Annotations - Fatal编程技术网

Java Spring的编译时和运行时注释之间的差异

Java Spring的编译时和运行时注释之间的差异,java,spring,spring-annotations,Java,Spring,Spring Annotations,在最近一次对Java开发人员的采访中,我遇到了一个关于spring注释的问题: 中编译时注释和运行时注释的区别是什么 春天 有这样的概念吗 如果您能给出答案,我们将不胜感激。注释是修饰类/属性或方法的通用方法。它们与编译时或运行时无关。 然而,使用注释来完成工作的类可以在编译时或运行时完成这项工作 例如: 春季AOP。对于AOP,您可以使用@Aspect注释来修饰类,并且根据您想要创建的代理类型,编织可以在编译时进行字节码修改,也可以在运行时进行。 您可以通过ajc编译器/JDK动态代理/CGL

在最近一次对Java开发人员的采访中,我遇到了一个关于spring注释的问题:

中编译时注释和运行时注释的区别是什么 春天

有这样的概念吗


如果您能给出答案,我们将不胜感激。

注释是修饰类/属性或方法的通用方法。它们与编译时或运行时无关。 然而,使用注释来完成工作的类可以在编译时或运行时完成这项工作

例如: 春季AOP。对于AOP,您可以使用@Aspect注释来修饰类,并且根据您想要创建的代理类型,编织可以在编译时进行字节码修改,也可以在运行时进行。
您可以通过ajc编译器/JDK动态代理/CGLib代理找到更多详细信息。

没有什么比编译时或运行时注释更好的了

它们是不同API读取的标记。根据它们的处理方式,可以将它们称为编译/运行时注释

Java为处理源代码注释提供了两种不同的选项。其中一个是编译时使用的注释处理API,另一个是运行时使用的反射API。e、 g.@覆盖注释由编译器读取

有点像你的问题。看看它:

通俗地说,当有人在Java中引用编译时或运行时注释时,他们很可能引用注释的指定或隐含保留策略。因此,回答采访问题需要了解Java注释的一般知识,以及Spring框架定义的特定注释。关于Java,他说:

注释可能只存在于源代码中,也可能以类或接口的二进制形式存在。二进制形式的注释可能在运行时通过JavaSE平台的反射库可用,也可能不可用。注释类型java.lang.annotation.Retention用于在这些可能性中进行选择

订购矿山有三种可能性:

编译器将丢弃源注释

类注释将由编译器记录在类文件中,但不需要在运行时由VM保留

运行时-编译器将注释记录在类文件中,并在运行时由VM保留,因此可以反射地读取注释

如果您可以访问源代码,则可以访问所有注释,但是具有源保留的注释将永远不会出现在编译的字节码中;它们永远不会出现在任何读取类的编译形式的工具上——比如编译下游应用程序时——没有字节码,运行时也不会加载任何东西

当注释具有类保留时,注释在使用注释的编译字节码中存在,因此可以通过直接对字节码进行操作的工具检查使用情况。示例包括编译器、代码质量工具(如Spotbugs)或运行时代码生成器ASM、javassist、Byte Buddy等。。虽然注释信息存在于字节码*.class文件中,但JVM不会在运行时加载此信息

最后,具有运行时保留的注释具有上述所有功能,但也在运行时加载到JVM中,并且可以使用运行程序中的反射API来发现

如果未为批注显式定义保留,则默认为RetentionPolicy.CLASS