`
dasheng
  • 浏览: 148518 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《java编程思想》学习笔记20 第20章 注解(annotation)

阅读更多

1,注解为我们在代码中添加信息提供了一种形式化的方法,使我们在以后的的工作中很方便的使用这些数据。

 

2,注解是众多引入java 5中的重要的语言变化之一,java 5 内置了3中注解,在java.lang有注解:

 

  @Override 表示当前的方法定义将覆盖超类的方法。

 

  @Deprecated,如果程序员用了标注为它的元素,那么编译器会发出警告信息。

 

  @SuppressWarrngs,关闭不当的编译器警告。

 

java还另外提供了四种注解,专门负责新注解的创建。

 

@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 =
  "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 UseCaseTracker {
  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 use case-" + i);
    }
  }
  public static void main(String[] args) {
    List<Integer> useCases = new ArrayList<Integer>();
    Collections.addAll(useCases, 47, 48, 49, 50);
    trackUseCases(useCases, PasswordUtils.class);
  }
} /* Output:

 

运行的结果:

 

Found Use Case:47 Passwords must contain at least one numeric
Found Use Case:48 no description
Found Use Case:49 New passwords can't equal previously used ones
Warning: Missing use case-50

 

3,模仿hibernate的注解

 

@Target(ElementType.TYPE) // Applies to classes only
@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 SQLInteger {
  String name() default "";
  Constraints constraints() default @Constraints;
} ///:~

 

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
  int value() default 0;
  String name() default "";
  Constraints constraints() default @Constraints;
} ///:~

 

public @interface Uniqueness {
  Constraints constraints()
    default @Constraints(unique=true);
} ///:~

 

处理器  创建表

 

public class TableCreator {
  public static void main(String[] args) throws Exception {
    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 the name is empty, use the Class name:
      if(tableName.length() < 1)
        tableName = cl.getName().toUpperCase();
      List<String> columnDefs = new ArrayList<String>();
      for(Field field : cl.getDeclaredFields()) {
        String columnName = null;
        Annotation[] anns = field.getDeclaredAnnotations();
        if(anns.length < 1)
          continue; // Not a db table column
        if(anns[0] instanceof SQLInteger) {
          SQLInteger sInt = (SQLInteger) anns[0];
          // Use field name if name not specified
          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];
          // Use field name if name not specified.
          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 + ",");
        // Remove trailing comma
        String tableCreate = createCommand.substring(
          0, createCommand.length() - 1) + ");";
        System.out.println("Table Creation SQL for " +
          className + " is :\n" + tableCreate);
      }
    }
  }
  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;
  }
} /* Output:

 

创建表的语句是:

 

CREATE TABLE MEMBER(
    FIRSTNAME VARCHAR(30),
    LASTNAME VARCHAR(50),
    AGE INT,
    HANDLE VARCHAR(30) PRIMARY KEY);
很不错。

 

javassist工具类,是jboss的子项目,有关字节码工程的,有空研究一下。

 

 

分享到:
评论

相关推荐

    java编程思想读书笔记

    《Java编程思想》是 Bruce Eckel 的经典著作,这本书深入浅出地讲解了Java语言的核心概念和编程技术。这份读书笔记记录了读者在研读此书过程中的理解和体会,涵盖了从基础语法到高级特性的全面解析。以下是笔记中...

    Java 5 annotation 学习笔记

    Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...

    Java自定义注解Annotation的使用

    ### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...

    Java Annotation注解技术

    Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...

    Java编程思想源代码及课后练习代码

    《Java编程思想》是一本由 Bruce Eckel 编著的经典Java教程,对于初学者和有经验的程序员来说,都是深入理解Java语言的重要参考书。这本书深入浅出地讲解了Java的核心概念,包括面向对象编程、泛型、并发、集合框架...

    JAVA编程思想习题及答案

    《JAVA编程思想习题及答案》是一份针对Java编程学习者的宝贵资源,它涵盖了Java语言的核心概念、设计模式以及实际编程技巧。这份资料通过习题的形式帮助学习者深入理解和掌握Java编程思想,同时提供了解答,使学习...

    java编程思想书本示例和习题答案

    《Java编程思想》是 Bruce Eckel 的经典著作,这本书深入浅出地介绍了Java语言的核心概念和技术,被广大Java程序员视为学习Java的必备参考书。这个压缩包包含了书中的实例代码和习题答案,对于读者理解和掌握Java...

    Java Annotation注解.doc

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但可以被编译器或运行时环境用来执行特定的操作,如代码分析、...

    Java编程思想习题答案代码

    《Java编程思想习题答案代码》是一份针对学习Java编程思想的宝贵资源,它提供了书中的课后习题解答,旨在帮助学习者在探索Java语言的过程中进行实践和检验自己的理解。这份资料通常与《Thinking in Java》这本书配套...

    Java注解Annotation验证

    Java注解Annotation用起来很方便,也越来越流行,由于其简单、简练且易于使用等特点,很多开发工具都提供了注解功能,不好的地方就是代码入侵比较严重,所以使用的时候要有一定的选择性。 这篇文章将利用注解,来做...

    java 注解annotation的使用以及反射如何获取注解

    Java注解(Annotation)是Java语言提供的一种元数据机制,用于向编译器或JVM提供额外的信息。这些信息可以用来验证代码、控制代码生成、配置应用等。注解是自Java 5版本引入的特性,它使得程序员可以在源代码中嵌入...

    JAVA JDK6学习笔记

    Java JDK6学习笔记是针对Java编程语言初学者和进阶者的一份宝贵资源,它涵盖了Java的基础语法,并通过经典且易于理解的实例进行讲解。在本文中,我们将深入探讨Java JDK6中的关键概念和特性,以帮助你更好地理解和...

    Java编程思想练习题答案(代码)

    这本书由Bruce Eckel撰写,被誉为Java学习者的经典之作。本资源包含了该书第四版的完整练习题答案,旨在帮助读者巩固和深化对书中理论的理解,通过实际编码来实践所学知识。 1. **基础语法与数据类型**: - Java...

    java注解annotation.rar

    Java注解,也称为 Annotation,是Java编程语言中的一种元数据机制,用于向编译器、JVM(Java虚拟机)或工具提供有关代码的信息。这些信息可以用来进行编译时检查、运行时处理,或者作为配置信息。注解不是程序的一...

    Java 注解(Annotation)

    Java 注解(Annotation) - 请认准 ih0qtq

    java编程思想练习题答案

    《Java编程思想》是Bruce Eckel的经典之作,它深入浅出地介绍了Java语言的核心概念和技术。这本书中的练习题是学习者提升技能的重要途径,而这个压缩包提供的就是这些练习题的解答,以源码的形式保存为.java文件。...

    JAVA Annotation学习

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以提供额外的信息,这些信息虽然不是程序运行所必需的,但能够帮助编译器、JVM(Java虚拟机)或工具更好...

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。

Global site tag (gtag.js) - Google Analytics