1、注解 Annotation

也称为元数据,和注释 comment 的区别:Annotation 可以提供编译期的一些操作,比如类型检查。Annotation 是Java 5 引入的新特性。Java 5 在 java.lang 中内置了三种标准注解。

@Override:表示当前方法其实是覆盖父类的方法

@Deprecated:表示该类或方法不建议使用了,未来有可能被废弃或者移除。

@SuppressWarnings:给编译器一条指令,告诉它对范围内的某些类型的警告保持静默。

同一个元素上可以使用多个不同注解。

2、自定义注解

因为 Java 内置的注解无法满足五花八门的需求,所以就需要我们自定义注解。

Java 内置了四种元注解,帮助申明自定义注解。

@Target:表示该注解可以使用在什么地方,参数是枚举类 ElementType:

TYPE:类,接口(包括注解类型),枚举类

FIELD:字段,变量

METHOD:方法

PARAMETER:参数

CONSTRUCTOR:构造器

LOCAL_VARIABLE:局部变量

ANNOTATION_TYPE:注解

PACKAGE:包

TYPE_PARAMETER:自定义类型参数

TYPE_USE:该注解能使用在使用类型的任意语句中,使用方法见下图

TYPE_USE

@Retention:表示需要在什么级别保存该注解信息(生命周期),参数 RetentionPolicy 包括

SOURCE:源码级别,注解将被编译器丢弃

CLASS:在编译器生成的 CLASS 文件中可用,但是会被 VM 丢弃。(默认的就是该级别)

RUNTIME:运行期保留该注解,所以此时可以通过反射机制来读取注解的信息

@Documented:将注解包含在 javadoc 中

@Inherited:允许子类继承父类的注解

自定义注解案列:

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface UseCase {

public int id();

public String description() default "no description";

}

public class PasswordUtils {

@UseCase(id = 47, description = "password must contain one number")

public boolean validatePassword(String password){

return true;

}

@UseCase(id = 48)

public String encryptPassword(String password){

return "encryptPassword()";

}

@UseCase(id = 49, description = "new password can't equal previously used ones")

public boolean checkouForNewPassword(){

return false;

}

}

配置参数可以使用的类型如下:

所有的基本类型。(int,float,boolean等)

String

Class

enum

Annotation

以上类型的数组

对于上面 UseCase 的demo,写一个程序来进行处理

public class UseCaseTracker {

public static void main(String[] args) {

// TODO Auto-generated method stub

List useCases = new ArrayList();

Collections.addAll(useCases, 47, 48, 49, 50);

trackUseCases(useCases, PasswordUtils.class);

}

public static void trackUseCases(List useCases, Class> cl) {

for (Method m : cl.getDeclaredMethods()){

// getDeclaredAnnotation 返回指定类型的 注解对象

UseCase uc = m.getDeclaredAnnotation(UseCase.class);

if (uc != null){

System.out.println("Found UseCase :" + uc.id() + "\t" + uc.description());

useCases.remove(new Integer(uc.id()));

}

}

System.out.println("--------------------------------------");

for (int i : useCases){

System.out.println("Warning : Miss use case --" + i);

}

}

}

结果如下:

Found UseCase :47 password must contain one number

Found UseCase :48 no description

Found UseCase :49 new password can't equal previously used ones

--------------------------------------

Warning : Miss use case --50

看一个复杂的案列

//告诉注解处理器,需要生成一个数据库表

//这个注解只能用于类,接口,enum

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface DBTable {

public String name() default "";

}

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Constraints {

//这些元素都有默认值,这样我们就不必强迫程序员必须赋值了

boolean primaryKey() default false;

boolean allowNull() default true;

boolean unique() default false;

}

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface SQLString {

//定义了元素名为value,在符合条件时,我们使用时,可以直接在括号内输入value的值就ok了。

int value() default 0;

String name() default "";

Constraints constraints() default @Constraints;

}

/**

* SQLInteger 和 SQLString一样,都是要求在javabean上,根据不同的数据类型使用不同的注解

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface SQLInteger {

String name() default "";

//注解嵌套

Constraints constraints() default @Constraints;

}

/**

* 我们的目的就是为该javabean生成一个创建表的语句

*/

@DBTable(name = "MEMBER")

public class Member {

@SQLString(30)

String firstName;

@SQLString(50)

String lastName;

@SQLInteger

Integer age;

@SQLString(value = 30,

constraints = @Constraints(primaryKey = true))

String handle;

static int memberCount;

}

public class TableCreator {

public static void main(String[] args) throws Exception{

StringBuilder createCommand = new StringBuilder();

String className = "test.annotation.database.Member";

Class> cl = Class.forName(className);

DBTable dbTable = cl.getAnnotation(DBTable.class);

String tableName = dbTable.name();

//如果名字为空,就使用类名

if (tableName.length() < 1){

tableName = cl.getName().toUpperCase();

}

createCommand.append(

"CREATE TABLE " + tableName + "(");

List columnDefs = new ArrayList();

for (Field field : cl.getDeclaredFields()){

String columnName = null;

Annotation[] anns = field.getDeclaredAnnotations();

if (anns.length < 1){

continue;

}

//这里的写法之所以简单,因为我们每个Field上面最多只有一个 注解

if (anns[0] instanceof SQLInteger){

SQLInteger sInt = (SQLInteger)anns[0];

//没有名字的话,我们就使用Field的名字来做为 列名

if (sInt.name().length() < 1){

columnName = field.getName();

}else {

columnName = sInt.name();

}

columnDefs.add(columnName + " INT " + getConstraints(sInt.constraints()));

}

if (anns[0] instanceof SQLString){

SQLString sString = (SQLString)anns[0];

if (sString.name().length() < 1){

columnName = field.getName();

}else {

columnName = sString.name();

}

columnDefs.add(columnName + " VARCHAR(" + sString.value()

+ ")" + getConstraints(sString.constraints()));

}

}

for (String columnDef : columnDefs){

createCommand.append("\n\t" + columnDef + ",");

}

//移除最后的一个逗号

String tableCreate = createCommand.substring(0, createCommand.length()-1) + ");";

System.out.println("TABLE Creation SQL for " + className + " is: \n" + tableCreate);

}

//解析出 Constraints 注解的内容

private static String getConstraints(Constraints con){

String constraints = "";

if (!con.allowNull()){

constraints += " Not Null";

}

if (con.primaryKey()){

constraints += " PRIMARY KEY ";

}

if (con.unique()){

constraints += " NNIQUE ";

}

return constraints;

}

}

输出结果:

TABLE Creation SQL for test.annotation.database.Member is:

CREATE TABLE MEMBER(

firstName VARCHAR(30),

lastName VARCHAR(50),

age INT ,

handle VARCHAR(30) PRIMARY KEY );

java todo注释_Java自定义注解相关推荐

  1. java类注释_java中注解

    一.什么是注解 注解是jdk5.0引入的新技术! 注解(Annotation):java中对某一程序片段注释说明.这个注释说明能被其它程序读到并执行相应操作! 二.注解的作用 1.能对于程序做出解释, ...

  2. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  3. java 自定义注解 解析_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  4. java method 注释_Java注解

    Java注解 注解概述 3.注解 3.1.注解,或者叫做注释类型,英文单词是:Annotation 疑问:注解到底是干啥的????????? 3.2.注解Annotation是一种引用数据类型.编译之 ...

  5. java运行时读取注解_Java自定义注解和运行时靠反射获取注解

    转:1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰 ...

  6. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

  7. java自定义注解处理器_java自定义注解学习(注解处理器)

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  8. java注解定义常量_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  9. java自定义注解为空值_java自定义注解

    1. Java注解(Annotation) Java注解是附加在代码中的一些元信息,用于一些工具在编译. 运行时进行解析和使用,起到说明.配置的功能. 注解相关类都包含在java.lang.annot ...

  10. java 自定义注解获取_Java自定义注解

    Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处. 以下通过自定义注解来深入了解java注解. 一.创建自定义注解 package com.sam.annotation ...

最新文章

  1. SaaS加速器II 能力中心:互利互补 共享商业红利
  2. 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...
  3. Spartan-6 FPGA SelectIO Resources User Guide 笔记2 SelectIO Attributes/Constraints
  4. Run ASMX Without IIS
  5. Java 运算符、表达式、语句
  6. 零基础入门深度学习(2) - 线性单元和梯度下降
  7. java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
  8. 方舟官方服务器怎么不显示伤害,方舟生存进化官服怎么显示伤害
  9. 如何设置Office Word2003的一级与二级标题
  10. 一个可以为你的任何创作加速的神软件
  11. elasticsearch-数据聚合
  12. Spring AOP切入点表达式
  13. 项目过程管理(一)团队分工与意识规范
  14. 《Effective Modern C++》Item 6: Use the explicitly typed initializer idiom when auto deduces undesired
  15. js中call 的使用, call方法的继承
  16. L1-051 打折 (5 分)
  17. Spring详细概述----->从入门到吃灰
  18. 论CRM免费软件的弊端
  19. 东北师范大学计算机大一操作题,东北师范大学计算机应用基础答案
  20. 用计算机解锁ipad密码忘了怎么办,iPad密码忘记了怎么办_iPad密码忘记解锁办法-太平洋IT百科手机版...

热门文章

  1. 解决layui的富文本编辑器中图片的大小问题
  2. 百宝云COM组件操作教程
  3. 【3分钟带你学】Ajax
  4. 第2次作业——时事点评
  5. leapmotion 导入 unity 3D 教程
  6. svn之黄色感叹号处理方法
  7. 项目团队管理:有效管理团队的八个方法
  8. 优秀网页翻译:关于您的下一个汽车友好型原型
  9. Linux服务与管理-step1
  10. BLUES吉他学习笔记007 bluesrv[11]