<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>全面 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E5%85%A8%E9%9D%A2/</link><description>Recent content in 全面 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 22 Nov 2017 21:06:43 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E5%85%A8%E9%9D%A2/index.xml" rel="self" type="application/rss+xml"/><item><title>Java 注解全面解析</title><link>https://pangyd.com/post/178-java/</link><pubDate>Wed, 22 Nov 2017 21:06:20 +0800</pubDate><guid>https://pangyd.com/post/178-java/</guid><description>&lt;p style="text-align: center">&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="550|338">&lt;/p>&lt;p>注解定义看起来很像接口的定义。事实上，与其他任何接口一样，注解也将会编译成class文件。&lt;/p>&lt;blockquote>&lt;p>@Target(ElementType.Method)&lt;/p>&lt;p>@Retention(RetentionPolicy.RUNTIME)&lt;/p>&lt;p>public @interface Test {}&lt;/p>&lt;/blockquote>&lt;p>除了@符号以外，@Test的定义很像一个空的接口。定义注解时，需要一些元注解（meta－annotation），如@Target和@Retention&lt;/p>&lt;p>@Target用来定义注解将应用于什么地方（如一个方法或者一个域）&lt;/p>&lt;p>@Retention用来定义注解在哪一个级别可用，在源代码中（source），类文件中（class）或者运行时（runtime）&lt;/p>&lt;p>在注解中，一般都会包含一些元素以表示某些值。当分析处理注解时，程序可以利用这些值。没有元素的注解称为标记注解（marker annotation）&lt;/p>&lt;p>四种元注解，元注解专职负责注解其他的注解，所以这四种注解的Target值都是ElementType.ANNOTATION_TYPE&lt;/p>&lt;table width="736" class="layui-table">&lt;tbody>&lt;tr class="firstRow">&lt;th style="text-align: center">注解&lt;/th>&lt;th style="text-align: center">说明&lt;/th>&lt;/tr>&lt;tr>&lt;td>@Target&lt;/td>&lt;td>表示该注解可以用在什么地方，由ElementType枚举定义&lt;br data-filtered="filtered">CONSTRUCTOR：构造器的声明&lt;br data-filtered="filtered">FIELD：域声明（包括enum实例）&lt;br data-filtered="filtered">LOCAL_VARIABLE：局部变量声明&lt;br data-filtered="filtered">METHOD：方法声明&lt;br data-filtered="filtered">PACKAGE：包声明&lt;br data-filtered="filtered">PARAMETER：参数声明&lt;br data-filtered="filtered">TYPE：类、接口（包括注解类型）或enum声明&lt;br data-filtered="filtered">ANNOTATION_TYPE：注解声明（应用于另一个注解上）&lt;br data-filtered="filtered">TYPE_PARAMETER：类型参数声明（1.8新加入）&lt;br data-filtered="filtered">TYPE_USE：类型使用声明（1.8新加入）&lt;br data-filtered="filtered">PS：当注解未指定Target值时，此注解可以使用任何元素之上，就是上面的类型&lt;/td>&lt;/tr>&lt;tr>&lt;td>@Retention&lt;/td>&lt;td>表示需要在什么级别保存该注解信息，由RetentionPolicy枚举定义&lt;br data-filtered="filtered">SOURCE：注解将被编译器丢弃（该类型的注解信息只会保留在源码里，源码经过编译后，注解信息会被丢弃，不会保留在编译好的class文件里）&lt;br data-filtered="filtered">CLASS：注解在class文件中可用，但会被VM丢弃（该类型的注解信息会保留在源码里和class文件里，在执行的时候，不会加载到虚拟机（JVM）中）&lt;br data-filtered="filtered">RUNTIME：VM将在运行期也保留注解信息，因此可以通过反射机制读取注解的信息（源码、class文件和执行的时候都有注解的信息）&lt;br data-filtered="filtered">PS：当注解未定义Retention值时，默认值是CLASS&lt;/td>&lt;/tr>&lt;tr>&lt;td>@Documented&lt;/td>&lt;td>表示注解会被包含在javaapi文档中&lt;/td>&lt;/tr>&lt;tr>&lt;td>@Inherited&lt;/td>&lt;td>允许子类继承父类的注解&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>&lt;/p>&lt;section class="">&lt;section data-by="96weixin">&lt;section style="text-align: center">&lt;section>&lt;img data-src="https://pangyd.com/uploads/2017/11/74c10f869f038762.jpg" data-type="jpeg" class="" data-ratio="1.09" data-w="100" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/section>&lt;section>&lt;h2>&lt;span>2. 注解元素&lt;/span>&lt;/h2>&lt;/section>&lt;/section>&lt;/section>&lt;/section>&lt;p>&lt;/p>&lt;p>&lt;span>– 注解元素可用的类型如下：&lt;/span>&lt;/p>&lt;p>– 所有基本类型（int,float,boolean,byte,double,char,long,short）&lt;/p>&lt;p>– String&lt;/p>&lt;p>– Class&lt;/p>&lt;p>– enum&lt;/p>&lt;p>– Annotation&lt;/p>&lt;p>– 以上类型的数组&lt;/p>&lt;p>如果使用了其他类型，那编译器就会报错。也不允许使用任何包装类型。注解也可以作为元素的类型，也就是注解可以嵌套。&lt;/p>&lt;p>元素的修饰符，只能用public或default。&lt;/p>&lt;p>&lt;span>– 默认值限制&lt;/span>&lt;/p>&lt;p>编译器对元素的默认值有些过分挑剔。首先，元素不能有不确定的值。也就是说，元素必须要么具有默认值，要么在使用注解时提供元素的值。&lt;/p>&lt;p>其次，对于非基本类型的元素，无论是在源代码中声明，还是在注解接口中定义默认值，都不能以null作为值。这就是限制，这就造成处理器很难表现一个元素的存在或缺失状态，因为每个注解的声明中，所有的元素都存在，并且都具有相应的值。为了绕开这个限制，只能定义一些特殊的值，例如空字符串或负数，表示某个元素不存在。&lt;/p>&lt;blockquote>&lt;p>@Target(ElementType.Method)&lt;/p>&lt;p>@Retention(RetentionPolicy.RUNTIME)&lt;/p></description></item></channel></rss>