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. ***RESTful API 设计指南(阮一峰)

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

  2. **app后端设计(10)--数据增量更新(省流量)

    在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...

  3. 传说中的WCF(2):服务协定的那些事儿

    上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...

  4. 问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the view outlet was not set.

    问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the vie ...

  5. React-非dom属性-dangerouslySetInnerHTML标签

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  6. iOS NSPredicate和正则表达式

    简述:Cocoa 提供了NSPredicate 用于指定过滤条件,谓词是指在计算机中表示计算真假值的函数,它使用起来有点儿像SQL 的查询条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的 ...

  7. iOS 动态特性和RunTime

    过去的几年中涌现了大量的Objective-C开发者.有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语 ...

  8. linux驱动分离分层的概念

    这个分离分层的概念和输入子系统有点像,但不是完全一样的.为什么会再弄一个这个模型出来我也没有搞懂,现在我的学习还停留在把知识学懂的层面上.至于为什么会产生这种知识,现在我还无从解释,还需时日成长. 这 ...

  9. http://www.cnblogs.com/wzh206/archive/2010/03/21/1691112.html

    http://www.cnblogs.com/wzh206/archive/2010/03/21/1691112.html

  10. RMI、Hessian、Burlap、Httpinvoker、WebService的比较

    RMI.Hessian.Burlap.Httpinvoker.WebService的比较 2(转)     [2]Java远程调用方法性能比较 [IT168技术]现在,Java远程调用方法很多,各种方 ...