编程语言中高级特性:注解

注意:本文以java为例说明。

什么是注解

Java注解是JDK1.5的新特性,与注释比较类似,不同的是注释是给我们开发人员看的,注解是给代码看的,它是代码层面的解释说明,注解也被称为元数据。注解的使用也很简单,语法规则:@注解名称,比如我们常见的“@Override”。

注解本身没有任何意义,单独的注解就是一种注释,他需要结合其他如反射等技术才有意义。

Java注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

Java注解应用

  • 生成文档这是最常见的,也是java 最早提供的注解;
  • 在编译时进行格式检查,如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
  • 跟踪代码依赖性,实现替代配置文件功能,比较常见的是spring 2.5 开始的基于注解配置,作用就是减少配置;
  • 在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口,可以在反射中解析并使用 Annotation。

Java注解分类

  • Java自带的标准注解
  • 元注解,用于定义注解的注解,通常用在注解的定义上
  • 自定义注解

注解的定义与使用

高级使用:通过反射获取注解的信息

# 创建类和注解
@Testclass("db_Student2")//类注解
//创建学生类
class Student2{
 @Testfield(columnname = "name",type = "varchar",length = 20)//属性注解
 String name;
 @Testfield(columnname = "age",type = "int",length = 3)
 int age;
 @Testfield(columnname = "ID",type = "int",length = 10)
 int ID;

 public Student2() {
 }

 public Student2(String name, int age, int ID) {

  this.name = name;
  this.age = age;
  this.ID = ID;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public int getID() {
  return ID;
 }

 public void setID(int ID) {
  this.ID = ID;
 }
}

//类的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Testclass{
 String value();
}

//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Testfield{
 String columnname();
 String type();
 int length();
}

# 反射操作注解
public class test05 {
 public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
  Class c1 = Class.forName("com.zjrcu.reflection.Student2");

  //通过反射获得注解
  Annotation[] annotations = c1.getAnnotations();
  for (Annotation annotation : annotations) {
   System.out.println(annotation);
  }

  //通过反射获得注解value的值
  Testclass testclass = (Testclass)c1.getAnnotation(Testclass.class);
  String value = testclass.value();
  System.out.println(value);

  //获取类中指定注解的value值
  Field f = c1.getDeclaredField("name");
  Testfield testfield = (Testfield) f.getAnnotation(Testfield.class);
  System.out.println(testfield.columnname());
  System.out.println(testfield.length());
  System.out.println(testfield.type());


 }
}

扩展阅读

Java注解
Java之注解与反射
利用注解和反射实现一个"低配版"的依赖注入
JAVA反射+运行时注解实现URL路由
使用Java元注解和反射实现简单MVC框架
C# 特性标签(Attribute)

此处评论已关闭