java todo注释_Java自定义注解
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自定义注解相关推荐
- java类注释_java中注解
一.什么是注解 注解是jdk5.0引入的新技术! 注解(Annotation):java中对某一程序片段注释说明.这个注释说明能被其它程序读到并执行相应操作! 二.注解的作用 1.能对于程序做出解释, ...
- java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...
- java 自定义注解 解析_java自定义注解
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- java method 注释_Java注解
Java注解 注解概述 3.注解 3.1.注解,或者叫做注释类型,英文单词是:Annotation 疑问:注解到底是干啥的????????? 3.2.注解Annotation是一种引用数据类型.编译之 ...
- java运行时读取注解_Java自定义注解和运行时靠反射获取注解
转:1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰 ...
- java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解
反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...
- java自定义注解处理器_java自定义注解学习(注解处理器)
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...
- java注解定义常量_java自定义注解
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- java自定义注解为空值_java自定义注解
1. Java注解(Annotation) Java注解是附加在代码中的一些元信息,用于一些工具在编译. 运行时进行解析和使用,起到说明.配置的功能. 注解相关类都包含在java.lang.annot ...
- java 自定义注解获取_Java自定义注解
Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处. 以下通过自定义注解来深入了解java注解. 一.创建自定义注解 package com.sam.annotation ...
最新文章
- SaaS加速器II 能力中心:互利互补 共享商业红利
- 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...
- Spartan-6 FPGA SelectIO Resources User Guide 笔记2 SelectIO Attributes/Constraints
- Run ASMX Without IIS
- Java 运算符、表达式、语句
- 零基础入门深度学习(2) - 线性单元和梯度下降
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- 方舟官方服务器怎么不显示伤害,方舟生存进化官服怎么显示伤害
- 如何设置Office Word2003的一级与二级标题
- 一个可以为你的任何创作加速的神软件
- elasticsearch-数据聚合
- Spring AOP切入点表达式
- 项目过程管理(一)团队分工与意识规范
- 《Effective Modern C++》Item 6: Use the explicitly typed initializer idiom when auto deduces undesired
- js中call 的使用, call方法的继承
- L1-051 打折 (5 分)
- Spring详细概述----->从入门到吃灰
- 论CRM免费软件的弊端
- 东北师范大学计算机大一操作题,东北师范大学计算机应用基础答案
- 用计算机解锁ipad密码忘了怎么办,iPad密码忘记了怎么办_iPad密码忘记解锁办法-太平洋IT百科手机版...