我们先来看看一个简单的注解类定义

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ValueBind {
    enum fieldType {
        STRING, INT
    };
fieldType type();
String value();
}

1、Annotation需要声明为@interface 这样的东西

2、@Target(ElementType.METHOD),代码这个@Target(ElementType.METHOD)必须且一定要注释在语句上面

@Target(ElementType.METHOD)声明Annotation必须声明在方法上,而不能声明在Class或Field属性上

@Target:表示该注解可以用于什么地方,ElementType的属性设置类型主要有:

TYPE:类、接口、或者枚举类型

FIELD:域或者属性类型

METHOD:方法声明类型

PARAMETER:参数声明

CONSTRUCTOR:构造方法声明

LOCAL_VARIABLE:局部变量声明

ANNOTATION_TYPE:注释声明

PACKAGE:包声明

3、@Retention(RetentionPolicy.RUNTIME),Retention设置为RUNTIME,说明在运行时用类反射来实现,代表需要在什么级别保存该注解信息

可用的RetentionPolicy类型有:

SOURCE:注解将被编译器抛弃

CLASS:注解在CLASS中保留,在JVM中废弃

RUNTIME:VM在运行时,一起保存注解

4、Documented   注解包含于JavaDoc中

到目前为止,相信大家已经对JAVA注解有了一个初步的了解和认识,下面就让我们一起做一个例子,来提高和巩固一下注解的高级使用

Hibernate的ORM映射机制,就是利用JAVA反射机制,逆向工程某一个数据表,相信大家应该还有印象,比如

类:Student.java文件,如果写成

@Table(name="T_Student")

public Class Student{......}

代表Student这个类,对应的数据库表为  T_Student,如果在有如下的写法,会怎么样呢?

@Table(name="T_Student")

Public Class Student {

private String id ="";

@id(init=1)

public void setId(String id){

this.id=id;

}

} 这就代表数据库表T_Student的主键是id,初始值是    1

好了,下面我们开始动手实现自己的例子,希望大家不要懒惰,打开你的eclipse和我一起动手

定义一个Class类 暂且为Student.java,其中有三个字段,代码如下:

public class Student implements Serializable {
private String name = "";

private int age = 0;

private String studentId = "";

public String getName() {

return name;
}

@ValueBind(type = fieldType.STRING, value = "张三")

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

public int getAge() {
return age;
}

@ValueBind(type = fieldType.INT, value = "30")
public void setAge(int age) {
this.age = age;
}

public String getStudentId() {
return studentId;
}

@ValueBind(type = fieldType.STRING, value = "101")
public void setStudentId(String studentId) {
this.studentId = studentId;
}

}

相信大家已经看到了,在set方法上我已经写了一个annotation注解,主要功能就是根据字段属性类型,自动赋予Student类中的Field属性一个默认值

下面让我们自定义一个ValueBind的annotation,这个ValueBind里面有两个值,让我们一起看看怎么做的吧

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ValueBind {
    enum fieldType {
        STRING, INT
    };
fieldType type();
String value();
}

大家已经看到了,整个annotation没有多少代码,非常简单,包含了两个值,一个是枚举,一个是String

下面我们利用JAVA反射机制,来实现我们的annotation,下面来看真正的实现

public class PersistStudent {
public static void main(String[] args) throws Exception {
Object c = Class.forName("com.annotation.Student").newInstance();
try {
Method[] methodArray = c.getClass().getDeclaredMethods();
for (int i = 0; i < methodArray.length; i++) {
if (methodArray[i].isAnnotationPresent(ValueBind.class)) {
ValueBind annotation = methodArray[i].getAnnotation(ValueBind.class);
String type = String.valueOf(annotation.type());
String value = annotation.value();
if (type.equals("INT")) {
methodArray[i].invoke(c, new Integer[] { new Integer(value)});
} else {
methodArray[i].invoke(c, new String[] { value });
}
}
}
Student annotaedStudent = (Student) c;
System.out.println("studentId====" + annotaedStudent.getStudentId()
+ "  studentnName====" + annotaedStudent.getName()
+ "   student Age====" + annotaedStudent.getAge());
} catch (Exception e) {
throw new Exception(e);
}
}
}

运行结果:studentId====101  studentnName====张三   student Age====30

ok,一个完整的Annotation已经学习完毕,相信大家收获不小吧~~~~~~~~

[置顶] 自定义java Annotation快速入门与提高的更多相关文章

  1. JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)

    接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...

  2. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  3. JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC

    接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...

  4. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  5. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  6. 如何让一个Java新手快速入门?

    问题中问到如何让java新生快速入门,既然想快速入门的话那最简单粗暴的方法就是多看视频,加上跟着视频敲代码,刚开始可能不知道是什么意思,敲得多了就慢慢知道是什么意思了. 刚开始建议在网上找那种结合自己 ...

  7. java 多线程 快速入门

    ------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...

  8. 没有基础的初学者学java怎样快速入门?超全的学习路线图

    现在地球人都知道互联网行业工资高,上万都是小case,不值一提.可是对于大部分人来说,工资七八千都算很难了.那我也想学java,当程序员,赚大钱.可是作为一个初学者,怎样才可以快速入门呢?早点入门就可 ...

  9. java框架--快速入门

    spring快速入门    1.创建项目        1.1创建项目文件夹        1.2启动idea ->文件->打开->点击创建的项目文件夹        1.3右键创建 ...

随机推荐

  1. Android Studio ADB响应失败解决方法

    当启动Android Studio时,如果弹出 adb not responding. you can wait more,or kill "adb.exe" process ma ...

  2. UBER司机奖励政策

    高峰时段: 早高峰:早6:30-8:30点 晚高峰:晚4:00-7:00点 *周六日只有晚高峰 其他时间均为平峰时段 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注 ...

  3. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  4. Eclipse 代码提示不显示的问题

    在备份Android SDK和Eclipse的时候出了问题,然后只能重新下载,SDK下得我都要吐血了,超慢.然后,我发现Eclipse有了新版本的,于是就下载了个新版的,结果出了问题了.所有的Andr ...

  5. openstack之keystone

    一.什么是keystone 用于为openstack家族中的其它组件成员提供统一的认证服务,包括身份认证.令牌发放和校验.服务列表.用户权限定义等: 基本概念: 用户User:用于身份认证.一个用户可 ...

  6. Your Job Is Not to Write Code

    I am lucky enough to work with a small team of fantastic engineers who truly care about their custom ...

  7. IIS 7关闭应用程序池自动回收设置

    在web应用程序中经常有一些任务就需要在Global文件启用一个线程来实现, 那假设我们在自己的ASP.NET应用程序中加入了Quartz.NET框架,并且配置等等都OK了. 这个站点访问量很少,现在 ...

  8. 移除GridView中的重复项

    1. The HTML Markup <div> <asp:GridView ID="GridView1" runat="server" Au ...

  9. centos7/redhat7 将网卡名字改成eth样式的方法

    方法/步骤    1. 编辑 /etc/sysconfig/grub 找到“GRUB_CMDLINE_LINUX”这一行 

  10. 'nmake' 不是内部或外部命令,VCVARS32.BAT路径问题

    'nmake' 不是内部或外部命令,VCVARS32.BAT路径问题 2014-5-24 VC运行不正确基本上都是路径的问题,今天在进行Openssl开发的环境搭建时,需要使用nmake进行源码和库的 ...