摘要: java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用,因此来说,反射的定义应该包含注解才合理一些。

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("注意:是遐想,不是瞎想!!");
}
}

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

  1. Java 注解基本原理

    原文地址 注解的本质 「java.lang.annotation.Annotation」接口中有这么一句话,用来描述『注解』. The common interface extended by all ...

  2. Java注解基本原理

    注解目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,一时方便,而是代码更加简洁. 注解的语法比较简单,除了@符号的使用之外,它基本与Java固有语法一致.Java S ...

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

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  4. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  5. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  6. Java注解实践

    Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...

  7. Java注解全面解析(转)

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  8. java注解(基础)

    一.认识注解 1.注解的定义: java提供了一种原程序中的元素关联任何信息和元数据的途径和方法. 2.学习注解的目的: (1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的) ...

  9. 10分钟学会JAVA注解(annotation)

    (原) 先认识注解(Annotation) 定义类用class,定义接口用interface,定义注解用@interface 如public @interface AnnotationTest{} 所 ...

随机推荐

  1. VS2005的depends工具 (分析EXE)

    忙乎了近两个月,程序开始打包供外部调用了,连同其所需的dll文件,这就需要使用VC自带的Depends软件,在VS2005中其路径为:D:\Program Files\Microsoft Visual ...

  2. iotBaidu问题小结

    1.后台程序不能正常运行: d:\>java -jar MqttService.jar Exception in thread "main" java.lang.Securi ...

  3. ALGO-1_蓝桥杯_算法训练_区间k大数查询

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  4. java操作Excel之POI(3)

    一.字体处理 /** * 字体处理 */ public static void main(String[] args) throws Exception { Workbook wb = new HSS ...

  5. html + php 框架

    <html> <head><meta http-equiv="Content-Type" content="text/html; chars ...

  6. git如何查看某个人提交的日志。

    我们知道,在git进行cherry-pick的时候,找到commit id是至关重要, 如果我们是很多人在一个分支开发,开发完了之后,发现某个人的功能,需要单独cherry-pick到另外一分支上去. ...

  7. sqlserver操作命令

    启动命令:Net Start MSSqlServer 暂停命令:Net Pause MSSqlServer 重新启动暂停的命令:Net Continue MSSqlServer 停止命令:Net st ...

  8. !!! jquery mobile常用代码

    Jquery MOBILE:  (2014-7-1 发布jquery.mobile 1.4.3版本) <!doctype html> <html> <head> & ...

  9. servletConfig的使用案例

    servletConfig参数的使用案例 首先,建立Dynamic Web Project ,同样命名FirstServlet,然后建立Servlet:Login.java,包名为cc.openhom ...

  10. 2. java获取下周日-下周六的时间

    String[] arrDate = new String[7]; String[] arrWeek = new String[7]; int mondayPlus = 0; Calendar cd ...