JAVA基础加强之注解

来源:互联网 发布:淘宝海底捞优惠券 编辑:程序博客网 时间:2024/06/11 11:15


注解Annotation就相当于一种标记,为程序打上某种标记后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各元素上有无何种标记,看有什么标记,就去干相应的事。注解可以加载包,类,字段,方法,方法的参数以及局部变量上。

看Java.lang包可以看到提供的最基本的下面三个注解。

1.Java提供的几个基本注解

@Override  表示当前方法是覆盖父类的方法。
@Deprecated  表示当前元素是不赞成使用的。
@SuppressWarnings 表示关闭一些编译器警告信息。

使用示例如下:

如一个没加注解,使用了过时方法的类:

public class zhujieTest {public static void main(String[] args) {System.runFinalizersOnExit(true);}}
编译会出现:


如果想用这个方法的话,就可以使用注解的方式:

@SuppressWarnings("deprecation")public class zhujieTest {public static void main(String[] args) {System.runFinalizersOnExit(true);//System.out.println(zhujieTest.class.isAnnotationPresent(zhujie.class));}}
显示结果为:



2.应用注解

一个注解就相当于一个类。其步骤为

1.创建注解类

public @interface A {}

2.应用注解到需要的地方

@Apublic class zhujieTest {public static void main(String[] args) {}}
3.对应用了注解类的类进行反射操作

@Apublic class zhujieTest {public static void main(String[] args) {//判断是否有这注解System.out.println(zhujieTest.class.isAnnotionPresent(A.class));}}


3.@Retention元注解

元注解就是注解的注解.元注解主要有:@Target,@Retention,@Documented,@Inherited

在上面代码中,虽然加了注解,但输出的结果会是false.为什么?因为注解的生命周期有三个阶段

Java源文件-->class文件-->内存中的字节码.这三个阶段就相当于三个过滤器一样,会一层层过滤掉自己不需要的东西,

编译是在内存上的字节码基础上完成的,而在那之前,注解已经过滤掉了,所以是false.为了让不同的注解保留在不同的阶段使用,

就出现了元注解,Retention,其有三个取值

RetetionPolicy.SOURCE,---源文件

RetetionPolicy.CLASS,---class文件(默认阶段!!!)

RetetionPolicy.RUNTIME---内存中的字节码
就分别对应这三个阶段.

则对注解A的代码为:

@Retention(RetentionPolicy.RUNTIME)public @interface A {}

另说明:

@Override  在SOURCE阶段
@Deprecated  在RUNTIME阶段
@SuppressWarnings 在SOURCE阶段

4.Target元注解

作用是说明了Annotation所修饰的对象范围:

 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数).

使用它可以让注解更加明晰其修饰的目标。

ElemenetType.CONSTRUCTOR 构造器声明 
 *         ElemenetType.FIELD 域声明(包括 enum 实例) 
 *         ElemenetType.LOCAL_VARIABLE 局部变量声明 
 *         ElemenetType.METHOD 方法声明 
 *         ElemenetType.PACKAGE 包声明 
 *         ElemenetType.PARAMETER 参数声明 
 *         ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 
使用方法如下: 

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface A {}
表示必须该注解注解在方法上.

如需表示多个地方都可以使用注解则

@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface A {}
注意大括号,其接收到是ElementType类型的数组.

5.为注解增加属性

这里参考了下其他人写的代码.

及其说明:

Annotation类型里面的参数该怎么设定: 
  第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   
  第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  
  第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

package annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果名称注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName {    String value() default "";}
package annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果颜色注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor {    /**     * 颜色枚举     * @author peida     *     */    public enum Color{ BULE,RED,GREEN};        /**     * 颜色属性     * @return     */    Color fruitColor() default Color.GREEN;}
package annotation;import annotation.FruitColor.Color;public class Apple {        @FruitName("Apple")    private String appleName;        @FruitColor(fruitColor=Color.RED)    private String appleColor;                    public void setAppleColor(String appleColor) {        this.appleColor = appleColor;    }    public String getAppleColor() {        return appleColor;    }            public void setAppleName(String appleName) {        this.appleName = appleName;    }    public String getAppleName() {        return appleName;    }        public void displayName(){        System.out.println("水果的名字是:苹果");    }}


0 0
原创粉丝点击