java注解

自定义注解

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值