自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface UseCase{
public int id();
public String description() default "no description";
}
class PasswordUtils{
@UseCase(id = 47, description = "Passwords must contain at least one numeric")
public boolean validatePassword(String password){
return (password.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48)
public String encryptPassword(String password){
return new StringBuilder(password).reverse().toString();
}
@UseCase(id = 49, description = "New passwords can't equal previously used ones")
public boolean checkForNewPassword(List<String> prevPasswords, String password){
return !prevPasswords.contains(password);
}
}
public class Main {
public static void trackUseCases(List<Integer> useCases, Class<?> cl){
for(Method m : cl.getDeclaredMethods()){
UseCase uc = m.getAnnotation(UseCase.class);
if(uc != null){
System.out.println("Found Use Case:" + uc.id() + " " + uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for (int i : useCases){
System.out.println("Warning : missing the case : " + i);
}
}
public static void main(String[] args) {
List<Integer> useCases = new ArrayList<>();
Collections.addAll(useCases, 47, 48, 49, 50);
trackUseCases(useCases, PasswordUtils.class);
}
}
注意:注解的默认值不能为null
利用注解来描述javaBean,这里是一个SQL的例子
package com.company;
import com.sun.org.apache.regexp.internal.RE;
import java.lang.annotation.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface DBTable{
public String name() default "";
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Constraints{
boolean primaryKey() default false;
boolean allowNull() default true;
boolean unique() default false;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface SQLString{
int value() default 0;
String name() default "";
Constraints constraints() default @Constraints;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface SQLInteger{
String name() default "";
Constraints constraints() default @Constraints;
}
@DBTable(name = "MEMBER")
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 String getHandle(){ return handle;}
public String getFirstName() {return firstName;}
public String getLastName() {
return lastName;
}
public String toString(){
return handle;
}
public Integer getAge() {
return age;
}
}
public class Main {
private static String getConstraints(Constraints con){
String constraints = "";
if(!con.allowNull())
constraints += " NOT NULL";
if(!con.primaryKey())
constraints += " PRIMARY KEY";
if(!con.unique())
constraints += " UNIQUE";
return constraints;
}
public static void main(String[] args) throws ClassNotFoundException {
if(args.length < 1){
System.out.println("arguments: annotated classes");
System.exit(0);
}
for(String className : args){
Class<?> cl = Class.forName(className);
DBTable dbTable = cl.getAnnotation(DBTable.class);
if(dbTable == null){
System.out.println("No DBTable annotations in class " + className);
continue;
}
String tableName = dbTable.name();
if(tableName.length() < 1){
tableName = cl.getName().toUpperCase();
}
List<String> columnDefs = new ArrayList<>();
for(Field field : cl.getDeclaredFields()){
String columnName = null;
Annotation[] anns = field.getDeclaredAnnotations();
if(anns.length < 1)
continue;
if(anns[0] instanceof SQLInteger){
SQLInteger sInt = (SQLInteger)anns[0];
if(sInt.name().length() < 1){
columnName = field.getName().toUpperCase();
}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().toUpperCase();
}else {
columnName = sString.name();
}
columnDefs.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints()));
}
StringBuilder createCommand = new StringBuilder("CREATE TABLE " + tableName + "(");
for(String columnDef : columnDefs){
createCommand.append("\n " + columnDef + ",");
}
String tableCreate = createCommand.substring(0,createCommand.length()-1) + ")";
System.out.println("Table Creation SQL for " + className + " is : \n" + tableCreate);
}
}
}
}
输出结果:
Table Creation SQL for com.company.Member is :
CREATE TABLE MEMBER(
FIRSTNAME VARCHAR(30) PRIMARY KEY UNIQUE)
Table Creation SQL for com.company.Member is :
CREATE TABLE MEMBER(
FIRSTNAME VARCHAR(30) PRIMARY KEY UNIQUE,
LASTNAME VARCHAR(50) PRIMARY KEY UNIQUE)
Table Creation SQL for com.company.Member is :
CREATE TABLE MEMBER(
FIRSTNAME VARCHAR(30) PRIMARY KEY UNIQUE,
LASTNAME VARCHAR(50) PRIMARY KEY UNIQUE,
AGE INT PRIMARY KEY UNIQUE)
Table Creation SQL for com.company.Member is :
CREATE TABLE MEMBER(
FIRSTNAME VARCHAR(30) PRIMARY KEY UNIQUE,
LASTNAME VARCHAR(50) PRIMARY KEY UNIQUE,
AGE INT PRIMARY KEY UNIQUE,
HANDLE VARCHAR(30) UNIQUE)