如果本文帮助到您,请点击下面的链接,这是本人的网站,以示鼓励,谢谢!链接绝对安全!

本人的网站

java注解属于java中高大上的功能,许多开源框架都使用了java注解的功能。比如spring,hibernate等等。

从几年前的java1.5开始,java新增了泛型、注解、并发的功能。这些功能都是java高大上的功能。到现在还在广泛的使用,

说明经典的重要的知识经的住时间的考验。最新的技术不都是很重要的知识。

注解用到两个反射方法

getDeclaredMethods() 和getAnnotation(),他们都属于AnnotatedElement接口(Class,Method与Field等类都实现了该接口)

getDeclaredAnnotations和getAnnotations的区别

Annotation[] anns = field.getDeclaredAnnotations();

Annotation[] anns = field.getAnnotations();

这两个方法有什么区别是:

虽然返回的类型是一样的,但是getDeclaredAnnotations返回的是具体的声明的注解;

field.getAnnotations()使用的Field类的父类的AccessibleObject的getAnnotations方法;getAnnotations方法返回getDeclaredAnnotations方法;

getDeclaredAnnotations方法的内容是throw new AssertionError("All subclasses should override this method");

即是AccessibleObject类的所有子类必须覆盖这个方法。即正确的调用方式应该是调用子类Field的getDeclaredAnnotations方法。

getDeclaredFields和getFields的区别

Class<?>的getFields方法只返回公共的字段,如果类没有公共的字段,那么返回长度为0的数组。

Class<?>的getDeclaredFields方法返回所有声明的字段(除了继承的字段):public, protected, default (package) access, and private fields,

getDeclaredMethods和getMethods的区别

getMethods方法返回所有公共的方法,包括从父类和父接口继承的方法。

getDeclaredMethods方法返回所有public, protected, default (package) access, and private methods, 但是排除 inherited methods.(继承的字段)

/**
*
*/
package annotation.database; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author Administrator
*
*/ @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
boolean primaryKey() default false; boolean allowNull() default true; boolean unique() default false;
}
/**
*
*/
package annotation.database; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author Administrator
*
*/ @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBTable {
public String name() default "";
}
/**
*
*/
package annotation.database; /**
* @author Administrator
*
*/
@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 String getFirstName() {
return firstName;
} public String getLastName() {
return lastName;
} public Integer getAge() {
return age;
} public String getHandle() {
return handle;
} public String toString() {
return handle;
} }
package annotation.database;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author Administrator
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger {
String name() default ""; Constraints constraints() default @Constraints; }
/**
*
*/
package annotation.database; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author Administrator
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
int value() default 0; String name() default ""; Constraints constraints() default @Constraints;
}
/**
*
*/
package annotation.database; import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; /**
* @author Administrator
*
*/
public class TableCreator { /**
* @param args
* @throws ClassNotFoundException
*/
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 (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();
field.getAnnotations();
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);
}
} 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;
} }

如果您觉得本文帮助到您,
请关注新浪微博"开心大冒险_往前冲冲冲",以示鼓励,让本人写出更好的文章帮到大家,谢谢!

或者点击下方的新浪微博分享即可。

Java编程思想-注解生成外部例子代码的更多相关文章

  1. Java编程思想-泛型-简单泛型例子

    基本类型无法做为类型参数 代码如下: /** * */ package test.thinkinjava.Generics; import java.util.ArrayList; import ja ...

  2. java编程思想-注解思维导图

  3. Java编程思想中关于闭包的一个例子

    Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...

  4. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  5. 注解的基本盘点 -- 《Java编程思想》

    注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...

  6. 转:ContextCapture通过手机照片生成java编程思想的三维模型

    原文地址:ContextCapture通过手机照片生成java编程思想的三维模型 从手机拍摄的办公桌场景照片  生成   倾斜摄影模型 截取部分照片如下图所示,详细内容参见原文.

  7. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  8. 《Java编程思想》读书笔记(二)

    三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...

  9. Java编程思想 第21章 并发

    这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_tim ...

随机推荐

  1. xml格式化写入文件

    参考xml文件地址:http://cloudprint.cainiao.com/template/standard/101 代码: package main import ( "encodi ...

  2. cf B Inna and Candy Boxes

    题意:输入n,然后输入n个数ai,再输入n个数bi,如果在1-ai中能找到两个数x,y,x和y可以相等,如果x+y=bi,答案加上x*y,否则减去1,让结果尽可能大,输出结果. #include &l ...

  3. iOS之H5和Native混合开发

    今天需要用到一个H5和Native 混合开发的项目,简单的写一点入门的东西,很简答: 先介绍一下简单的配置步骤: 1.新建项目:SB拖一个UIWebView 按住Ctrl 拖线delegate 设置为 ...

  4. 稍加详细的ATR信息,将完善历史字节部分+

    http://blog.csdn.net/jennyvenus/article/details/2900697 //Reset 3B FB 13 00 00 81 31 FE 45 65 46 53 ...

  5. Caption,Text,WindowText的区别——TControl也有FText,是为了模拟一个窗口

    TControl = class(TComponent) // 控件的Windows功能从TControl开始 property Caption: TCaption read GetText writ ...

  6. 1027. Colors in Mars (20) PAT

    题目:http://pat.zju.edu.cn/contests/pat-a-practise/1027 简单题,考察十进制数和n进制数的转换和输出格式的控制. People in Mars rep ...

  7. 揭开Linux操作系统的Swap交换区之谜

    揭开Linux操作系统的Swap交换区之谜 Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要.通过调整Swap ...

  8. bzoj3123

    首先肯定是主席树但这是一类“动态树”,似乎没有什么好的办法那就暴力呗,这里用到启发式合并,即两棵树合并,重建节点少的的那棵可以用并查集维护连通性查询主席树的建立还是和bzoj2588一样 ; type ...

  9. android关于图片缩放

    网上有许多关于图片缩放的demo,本人都感觉不怎么好用,最近在github看到了 一个简单的支持多指缩放图片的Android View类 gesture-imageview (地址:https://g ...

  10. C++的一些内置函数

    C++里面有一些内置函数,实现了一些常用功能.虽然我手写也能写出这些函数,但是在srm或者其他一些需要速度的地方,用内置函数的优势就能体现出来了. 1.__gcd(a, b),返回a,b的最大公约数, ...