package annotation.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 定义注解 Test <br>
* 为方便测试:注解目标为类 方法,属性及构造方法<br>
* 注解中含有三个元素 id ,name和 gid; <br>
* id 元素 有默认值 0 <br>
*/
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
//有四个元注解,一般这两个 就可以搞定了
public @interface TestA {
String name() default ""; //不写的话默认为空,不报错
int id() default ;
Class<Long> gid();
}
 1 package annotation.test;
2
3 import java.util.HashMap;
4 import java.util.Map;
7 /**
8 * 这个类专门用来测试注解使用
9 */
10
11 @TestA(name="type",gid=Long.class)
12 // 使用了类注解
13 public class UserAnnotation {
16 @TestA(name="param",id=1,gid=Long.class) // 使用了类成员注解
17 private Integer age;
18
19 @TestA(name="construct",id=2,gid=Long.class)// 使用了构造方法注解
20 public UserAnnotation() {
22 }
23
24 @TestA(name="public method", id=3, gid=Long.class)// 使用了 public 方法注解
25 public void a() {
26 Map<String, String> m = new HashMap<String, String>(0);
27 }
28
29 @TestA(name="protected method", id=4, gid=Long.class)//protected 方法注解
30 protected void b() {
31 Map<String, String> m = new HashMap<String, String>(0);
32 }
33
34 @TestA(name="private method " , id = 5, gid=Long.class) // private 方法注解
35 private void c(){
36 Map<String, String> m = new HashMap<String, String>(0);
37 }
38
39 public void b(Integer a){
41 }
42 }
package annotation.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class ParseAnnotation { /**
* 简单打印出UserAnnotation 类中所使用到的类注解
* 该方法只打印了 Type 类型的注解
* @throws ClassNotFoundException
*/
public static void parseTypeAnnotation() throws ClassNotFoundException{
Class clazz = Class.forName("annotation.test.UserAnnotation");
Annotation[] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations) {
TestA testA = (TestA) annotation;
System.out.println("type name = "+clazz.getName() + " | id = " + testA.id() + " | name = " + testA.name() + " |                     gid = " + testA.gid());
}
} /**
* 简单打印出UserAnnotation 类中所使用到的方法注解
* 该方法只打印了 Method 类型的注解
* @throws ClassNotFoundException
*/
public static void parseMethodAnnotation() throws ClassNotFoundException{
Method[] methods = UserAnnotation.class.getDeclaredMethods();
for (Method method : methods) {
/*
* 判断方法中是否有指定注解类型的注解
*/
boolean hasAnnotation = method.isAnnotationPresent(TestA.class);
if(hasAnnotation){
TestA annotation = method.getAnnotation(TestA.class);
System.out.println("method name = " + method.getName() + " | id = " +
annotation.id() + " | description = " + annotation.name() + " | gid = " + annotation.gid());
}
}
} /**
* 简单打印出UserAnnotation 类中所使用到的构造方法注解
* 该方法只打印了 构造方法 类型的注解
* @throws ClassNotFoundException
*/
public static void parseConstructAnnotation() throws ClassNotFoundException{
Constructor[] constructors = UserAnnotation.class.getConstructors();
for (Constructor constructor : constructors) {
/*
* 判断构造方法中是否有指定注解类型的注解
*/
boolean hasAnnotation = constructor.isAnnotationPresent(TestA.class);
if(hasAnnotation){
/*
* 根据注解类型返回方法的指定类型注解
*/
TestA annotation = (TestA) constructor.getAnnotation(TestA.class);
System.out.println("constructor = " + constructor.getName()
+ " | id = " + annotation.id() + " | description = "
+ annotation.name() + " | gid= "+annotation.gid());
}
}
} /**
* 简单打印出UserAnnotation 类中所使用到的字段注解
* 该方法只打印了 Method 类型的注解
* @throws ClassNotFoundException
*/
public static void parseFieldAnnotation() throws ClassNotFoundException{
Field[] fields = UserAnnotation.class.getDeclaredFields();
for (Field field : fields) {
boolean hasAnnotation = field.isAnnotationPresent(TestA.class);
if(hasAnnotation){
TestA annotation = field.getAnnotation(TestA.class);
System.out.println("Field = " + field.getName()
+ " | id = " + annotation.id() + " | description = "
+ annotation.name() + " | gid= "+annotation.gid());
}
}
} public static void main(String[] args) throws ClassNotFoundException {
System.out.println("------------------------------解析Type注解----------------------------------------------------------");
parseTypeAnnotation();
System.out.println("------------------------------解析Method注解-------------------------------------------------------");
parseMethodAnnotation();
System.out.println("------------------------------解析构造方法(Construct)注解------------------------------------------");
parseConstructAnnotation();
System.out.println("------------------------------解析字段(Field)注解-----------------------------------------------------");
parseFieldAnnotation();
}
}

Annotation(jdk5.0注解)复习(转自http://3w_cnblogs_com/pepcod/)的更多相关文章

  1. Spring4.0之四:Meta Annotation(元注解)

    Spring框架自2.0开始添加注解的支持,之后的每个版本都增加了更多的注解支持.注解为依赖注入,AOP(如事务)提供了更强大和简便的方式.这也导致你要是用一个相同的注解到许多不同的类中去.这篇文章介 ...

  2. AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.

    把Androidstudio2.2的项目放到3.0里面去了,然后开始报错了. 体验最新版AndroidStudio3.0 Canary 8的时候,发现之前项目的butter knife报错,用到注解的 ...

  3. JDK 5.0 注解知识快速进阶

    1.了解注解 对于Java开发人员来说,在编写代码时,除了源程序外,还会使用Javadoc标签对类.方法或成员变量进行注释,一遍使用Javadoc工具生成和源代码配套的Javadoc文件,如@para ...

  4. Day07 jdk5.0新特性&Junit&反射

    day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装M ...

  5. [2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

    转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习 ...

  6. Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用

    Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019 ...

  7. JDK5.0新特性 (Day_07)

      JDK5.0新特性   目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括 ...

  8. JDK5.0新特性1

    目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括: 静态导入 自动装箱/拆箱 ...

  9. Java基础和JDK5.0新特性

    Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...

随机推荐

  1. Codeforces Round #258 (Div. 2)(A,B,C,D)

    题目链接 A. Game With Sticks time limit per test:1 secondmemory limit per test:256 megabytesinput:standa ...

  2. js:字符串(string)转json

    第一种方式: 使用js函数eval(); testJson=eval(testJson);是错误的转换方式. 正确的转换方式需要加(): testJson = eval("(" + ...

  3. E文阅读

    Lesson 9 A cold welcome 冷遇 What does 'a cold welcome' refer to?On Wednesday evening, we went to the ...

  4. appserv安装

    Appserv  官网: http://www.appservnetwork.com/ 安装好后,输入http://localhost:8082/验证是否装成功,成功后如下图

  5. Gradle Goodness: Skip Building Project Dependencies

    If we use Gradle in a multi-module project we can define project dependencies between modules. Gradl ...

  6. C连接oracle(PROC*C)

    1. 安装oralce 10g 2.建立数据库和用户 配置VS2005环境  proc需要嵌入式环境 在C/C++常规里面加入 D:\oracle\product\10.2.0\db_1\precom ...

  7. 一起学习redis源码

    redis的一些介绍,麻烦阅读前面的几篇文章,想对redis的详细实现有所了解,强力推荐<redis设计与实现>(不仅仅从作者那儿学习到redis的实现,还有项目的管理.思想等,作者可能比 ...

  8. malloc/free 和 new/delete 的区别

    1.malloc在C和C++中的区别 1.1.C中可以将任意的指针赋值给void*类型的变量.也可以将void*类型的值赋值给通常的指针变量. ---------------------------- ...

  9. linux shell 命令学习(4) cut - remove sections from each line of files

    之前写了split命令,split主要是按照行来进行文件的分割,而cut 是按照列来进行文件内容的选取 cut OPTION... [FILE]... 描述: 按列选取FILE的内容进行输出 -d : ...

  10. JS解析json数据

    JS解析json数据(如何将json字符串转化为数组) 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q ...