注解

来源:互联网 发布:奥斯维辛集中营 知乎 编辑:程序博客网 时间:2024/06/07 16:44

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。以上摘自百度百科。平时用到最多的注解可能是JAVA内置的标准注解,在主流框架中使用到注解很广泛,谈到注解,肯定会使用到反射机制。

public interface iface {    @Deprecated    public void stop();    @Deprecated    public void start();}
public class Start implements iface {    @Override    public void stop() {       System.out.print("stop");    }    @Override    public void start() {        System.out.print("start");    }    public static void main(String []args){        Start s = new Start();        s.start();        s.stop();    }}
运行程序后,发现编译器发出警告:



说明@Deprecated会使父类中的方法过时

下面简单的介绍下JAVA内置的三种标准注解:

@Override:表示当前方法定义将覆盖父类中的方法

@Deprecated:发出警告,不赞成使用已经弃用的代码

@SuppressWarnings:关闭编译器警告信息


我们也可以自定义注解,所以就简单了解下元注解,即注解的注解,下面介绍下元注解:

@Target:表示注解用于什么地方,ElementType参数有CONSTRUCTOR(构造器声明),FIELD(域声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类,接口(包括注解类型)或enum声明)

@Retention:表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

SOURCE:注解将被编译器丢弃

CLASS:注解在class文件中可用,但会被VM丢弃

RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。

@Document:将注解包含在Javadoc中

@Inherited:允许子类继承父类中的注解


说了这么多,下面就来自定义注解吧:

自定义注解写法,有点像接口,但是多了一个@,其中成员,注解中的字段,需要写成类似函数,且可以指定默认值:

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface ifSetAge {    public int j = 21;    public int age() default j;}

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface ifSetId {    public int Id() default 1125;}
@Target({FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface ifSetAddress {    public String Address() default "chongqing";}
@Target({FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface ifSetName {    public String Name() default "diy_os";}

/** * Created by diy_os on 2016/11/5. */public class Student{    @ifSetAge(age = 22)    private int age;    @ifSetId(Id = 1000)    private int id;    @ifSetName(Name = "LiosWang")    private String name;    @ifSetAddress(Address = "hangzhou")    private String  address;    public Student(){    }    public int getAge(){        return this.age;    }    public int getId(){        return this.id;    }    public String getName(){        return this.name;    }    public String getAddress(){        return this.address;    }    public void setAge(int age){        this.age = age;    }    public void setId(int id){        this.id = id;    }    public void setName(String name){        this.name = name;    }    public void setAddress(String address){        this.address = address;    }    public String toString(){        return "id="+this.getId()+"\n"+"name="+this.getName()+"\n"+"age="+this.getAge()+"\n"+"address="+this.getAddress();    }    public static void main(String[] args){       Student student = new Student();        Class<?> c = student.getClass();        Field fields[]= c.getDeclaredFields();        for(Field f:fields){            boolean isifSetId = f.isAnnotationPresent(ifSetId.class);            if(isifSetId){                ifSetId ifSetId = f.getAnnotation(ifSetId.class);                student.setId(ifSetId.Id());            }        }        for(Field f:fields){            boolean isifSetAge = f.isAnnotationPresent(ifSetAge.class);            if(isifSetAge){                ifSetAge ifSetAge = f.getAnnotation(ifSetAge.class);                student.setAge(ifSetAge.age());            }        }        for(Field f:fields){            boolean isifSetName = f.isAnnotationPresent(ifSetName.class);            if(isifSetName){                ifSetName ifSetName = f.getAnnotation(ifSetName.class);                student.setName(ifSetName.Name());            }        }        for(Field f:fields){            boolean isifSetAddress = f.isAnnotationPresent(ifSetAddress.class);            if(isifSetAddress){                ifSetAddress ifSetAddress = f.getAnnotation(ifSetAddress.class);                student.setAddress(ifSetAddress.Address());            }        }        System.out.println(student);                try {            Method m = c.getMethod("setAge",int.class);            m.invoke(student,100);        } catch (Exception e) {            e.printStackTrace();        }        System.out.print(student);    }}

上面代码利用反射机制,把各个成员变量的注解赋值给各个成员变量,当然可以通过反射,动态修改成员变量的值。

                                                                                                                                                                                                                                                           本文参考:点击打开链接

0 0