注解
来源:互联网 发布:奥斯维辛集中营 知乎 编辑:程序博客网 时间: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); }}
上面代码利用反射机制,把各个成员变量的注解赋值给各个成员变量,当然可以通过反射,动态修改成员变量的值。
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解
- 注解。
- 注解
- 注解
- 注解
- 注解
- java利用正则表达式获取一个网页中的所有邮箱地址
- structs2 文件下载
- 【我的Android进阶之旅】解决Android Studio启动时报错:Java 1.8 or later is required.
- 【玲珑杯 1051】【构造】My-graph
- 我读YOLO
- 注解
- 最短路径算法正确性和操作性闲杂谈-Dijkstra&Floyd算法
- 刘未鹏 - 为什么你现在就应该开始写博客
- python菜鸟的心得体会1
- UE4 设置Button触控区域为图片形状
- MyEclipse配置spket插件编写Extjs自动提示代码
- org.apache.jasper.JasperException: Unable to compile class for JSP
- Leetcode397: Integer Replacement
- 常见对象_String面试题看程序写结果