java 注解的基本原理和编程实现

java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用,因此来说,

反射的定义应该包含注解才合理一些。当然,这只是个人想法,至于java官方为什么这么泾渭分明不得而知,最重要的是如何使用注解。

注解的功能分为2部分:

  1. 作为特定的标记
  2. 额外信息的载体

>>>>定义一个UserAnnotation注解类

@Target(value = { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
	public int id() default 0;
	public String name() default "";
	public int age() default 18;
	public String gender() default "M";
}

其中@target个@Retention本身就是注解

【@target】这个注解来指定给哪一类java成员注解,指定注解目标该是什么样的东西

注解@Target的源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE) //这不是在作弊,这确实是自己注解自己,所以说注解也可以被字节给注解
public @interface Target {
    ElementType[] value(); //值可以使数组 value={...}
}

public enum ElementType {
    TYPE,  //给类(型)注解
    FIELD, //给字段注解,不要忘了,字段可以是对象
    METHOD, //给方法注解
    PARAMETER, //给参数注解
    CONSTRUCTOR, //给构造方法注解
    LOCAL_VARIABLE, //给局部变量注解
    ANNOTATION_TYPE,//给注解注解(这貌似把自己不当类来看)
    PACKAGE, //给包注解
    TYPE_PARAMETER, //不知道,等知道了我再写在这里
    TYPE_USE //这个也不知道
}

【@Retention】表示注解运行的状态,换句话说,注解改在什么样的状态下才能运行

注解@Retention的源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

public enum RetentionPolicy {
    SOURCE, //源码状态运行,
    CLASS, //编译类文件时运行
    RUNTIME //运行时运行
}

一般来说,源码状态运行和编译状态运行的注解往往和编译器相关,比如报错,警告,类编译参数等,这2类状态一般和编辑器插件关系密切,这里不再讨论

在日常开发中RUNTIME用的最多,这是开发人员可以控制的一个状态。

【@Documented】额,不多解释,具体来说是生成说明文档时把类的解释添加进去。

关于注解的方法说明,注解只有方法,没有字段,因为注解也是一个interface,只不过前面加了一个@符号,还有一点是这些方法无法实现,写法和C++的纯虚函数相似

请看id()方法的解释

 public int id() default 0; 
/*首先,方法必须是public的,去掉public,默认也是public,接口interface不也是这样么
 *
 *其次,default默认值不是必须的,方法必须有返回值,返回值可以是java中复杂对象,也可以是基本类型,枚举都行
 *如 ElementType[] value();
 */

注解定义好了,怎么使用呢,如下

public class TestMain
{
  @UserAnnotation(age=20,gender="F",id=2014,name="zhangsan")//注解的使用
  private Object obj;
  
  public static void main(String[] args) throws Exception
  {
     Filed objField = TestMain.class.getField("obj");
     UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//得到注解,起到了标记的作用
     
    System.out.println(ua.age()+","+ua.gender()+","+ua.id()+","+ua.name());
    //***进一步操作的话,假设Object要指向一个User类,那么可以讲注解的值给他
    TestMain tm = new TestMain();
    objFiled.set(tm,new User(ua.age(),ua.gender(),ua.id(),ua.name())); //不错吧,将自己的信息送给obj,起到了附加信息的作用
    
    //-----------请自由遐想吧~~,下面来说说注解怎么能获得注解自己的注解-------------
   Target t = ua.annotationType().getAnnotation(Target.class)
   ElementType[] values = t.value();
   //~~~~~~~~~~~~~~完了,再一次自由遐想吧~~~~~~~~~~~~~~
   
   Sysout.out.println("注意:是遐想,不是瞎想!!");
  }
}

try doing it.

时间: 2024-07-31 13:36:17

java 注解的基本原理和编程实现的相关文章

Java注解编程指南

Java注解编程指南 Java Annotation Tutorial +1概念 注解是JDK1.5开始引入的一个Java语言新特性.注解是与接口很相似,它与类.接口.枚举是在同一个层次,它 们都称作为java 的一个类型(TYPE). +1.1Java语言指南解释 注解(也被称做元数据),为我们提供了程序代码的描述信息,而这些描述信息并不属于程序本身.注解并不直接 影响其注释的代码的工作. +1.2Java编程思想解释 注解(也被称做元数据),为我们在代码中添加信息提供了一种形式化的方法,使我

Java注解介绍

原文链接: Java Annotations: An Introduction原文日期: 2005年10月14日翻译日期: 2014年07月20日翻译人员: 铁锚 翻译完后,感觉这篇文章是不是在http://www.developer.com被挖坟了? Java注解介绍 基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,毫无疑问,多人合作的开发,使用注解变成很好的合作方式,相互之间的影响和耦合可以很低]. 基于注解的开发将

10分钟学会JAVA注解(annotation)

(原) 先认识注解(Annotation) 定义类用class,定义接口用interface,定义注解用@interface 如public @interface AnnotationTest{} 所有的注解类型都自动的继承于java.lang.annotation.Annotation接口 Annotation接口文档中这样描述:所有注解类型都扩展于这个公共的接口,注意,一个接口, 手动的继承了这个接口,并不意味着它是一个注解类型.换句话说,这个接口本身不是一个注解类型. 注意:这里Annot

Java注解全面解析(转)

1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(RetentionPolicy.RUNTIME) public @interface Test {} 除了@符号以外,@Test的定义很像一个空的接口.定义注解时,需要一些元注解(meta-annotation),如@Target和@Retention @Target用来定义注解将应用于什么地方(如一个方法或者一个

Java注解实践

Java注解实践 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK 基本Annotation 注解 说明 @Override 重写 @Deprecated 已过时 @SuppressWarnings(value = "unchecked") 压制编辑器警告 @SafeVarargs 修饰"堆污染"警告 @FunctionalInterface Java8特有的

Java 注解(Annoation) 事实说话

1 Junit中的@Test为例: 1.1 用注解(@Test)前 private boolean isTestMethod(Method m) { return m.getParameterTypes().length == 0 && m.getName().startsWith("test") && m.getReturnType().equals(Void.TYPE); } 用注解前(Junit4之前),Junit一般通过类似与上面的代码来获取一个

java 注解 学习

周末闲来无事,想要研究一下注解方面的知识,以前看过几次,都忘记了,这次学习下,并且写篇文章记录下, 1.元注解  元注解是指注解的注解.包括 @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略  Java代码 复制代码代码如下: @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CL

JAVA 注解的几大作用及使用方法详解

JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种: 1.生成文档.这是最常见的,也是java 最早提供的注解.常用的有@see @param @return 等:

Java 注解(Annotation)概念及实战

摘要: java注解:java 提供了一种源程序中的 元素 关联任何信息和任何元数据的途径和方法. 学习注解的目的: 能够读懂别人写的代码,特别是框架相关的代码 让编程更加简洁,代码更加清晰 让别人高看一眼,特别是会使用自定义注解 目录: java中的常见注解 注解分类 自定义注解 注解应用实践 1. java中的常见注解 1) JDK 自带的注解 @Override @Deprecated @SuppressWarnings2) 常见的第三方注解 Spring @Autowired @Serv