周末闲来无事,想要研究一下注解方面的知识,曾经看过几次,都忘记了,这次学习下,而且写篇文章记录下,

1、元注解 

元注解是指注解的注解。包含 @Retention @Target @Document @Inherited四种。 

1.1、@Retention: 定义注解的保留策略 

Java代码 

复制代码代码例如以下:





@Retention(RetentionPolicy.SOURCE) //注解仅存在于源代码中,在class字节码文件里不包括 

@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件里存在,但执行时无法获得, 

@Retention(RetentionPolicy.RUNTIME)//注解会在class字节码文件里存在,在执行时能够通过反射获取到 





1.2、@Target:定义注解的作用目标 


Java代码 

复制代码代码例如以下:





@Target(ElementType.TYPE) //接口、类、枚举、注解 

@Target(ElementType.FIELD) //字段、枚举的常量 

@Target(ElementType.METHOD) //方法 

@Target(ElementType.PARAMETER) //方法參数 

@Target(ElementType.CONSTRUCTOR) //构造函数 

@Target(ElementType.LOCAL_VARIABLE)//局部变量 

@Target(ElementType.ANNOTATION_TYPE)//注解 

@Target(ElementType.PACKAGE) ///包 





elementType 能够有多个,一个注解能够为类的,方法的,字段的等等 

1.3、@Document:说明该注解将被包括在javadoc中 

1.4、@Inherited:说明子类能够继承父类中的该注解 

2、注解的自己定义 

Java代码 

复制代码 代码例如以下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface HelloWorld {
public String name() default "";
}



3、注解的使用,測试类 


Java代码 

复制代码 代码例如以下:

public class SayHello {
@HelloWorld(name = " 小明 ")
public void sayHello(String name) {
System.out.println(name + "say hello world!");
}//www.heatpress123.net
}

4、解析注解 

java的反射机制能够帮助,得到注解,代码例如以下: 

Java代码 

复制代码 代码例如以下:

public class AnnTest {
public void parseMethod(Class<?> clazz) {
Object obj;
try {
// 通过默认构造方法创建一个新的对象
obj = clazz.getConstructor(new Class[] {}).newInstance(
new Object[] {});
for (Method method : clazz.getDeclaredMethods()) {
HelloWorld say = method.getAnnotation(HelloWorld.class);
String name = "";
if (say != null) {
name = say.name();
System.out.println(name);
method.invoke(obj, name);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
AnnTest t = new AnnTest();
t.parseMethod(SayHello.class);
}
}

看到了,非常easy吧,看了java编程思想里面有个复杂点的样例,我们来温习一遍,他是用注解实现一个创建数据库的样例。

先写一个数据库名字的注解,用来读取数据库的名字:

package com.bin.annotation;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBTable {
public String name() default"";
}

创建一个integer类型的字段:

package com.bin.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger {
String name() default""; //默觉得空
Constraints constraints() default @Constraints; //字段的其它类型定义
}

创建一个String 类型的字段:

package com.bin.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
int value() default 0;
String name() default "";
Constraints constraints() default @Constraints;
}

一些其它定义

package com.bin.annotation;
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
boolean primaryKey() default false;
boolean allowNull() default true;
boolean unique() default false;
}

创建一个注解的bean

package com.bin.annotation;

@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 toString(){return handle.toString();}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getHandle() {
return handle;
}
public void setHandle(String handle) {
this.handle = handle;
}
}

最后让我们解析这个注解吧:

package com.bin.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class TableCreator {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> cl =Member.class;
DBTable dbtalbe=cl.getAnnotation(DBTable.class);
String tableName = dbtalbe.name();
if(tableName.length() <1)
tableName=cl.getName().toUpperCase();
List<String> columnDefs = new ArrayList<String>();
for(Field filed : cl.getDeclaredFields()){
String columnName = null;
Annotation[] anns = filed.getDeclaredAnnotations();
if(anns.length < 1)
continue;
if(anns[0] instanceof SQLInteger){
SQLInteger sInt = (SQLInteger)anns[0];
if(sInt.name().length() < 1)
columnName = filed.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 = filed.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)+"\n );";
System.out.print(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注解学习笔记

    我们平常写Java代码,对其中的注解并不是很陌生,比如说写继承关系的时候经常用到@Override来修饰方法.但是@Override是用来做什么的,为什么写继承方法的时候要加上它,不加行不行.如果对J ...

  2. java注解学习(1)注解的作用和三个常用java内置注解

    今天,记录一下自己学习的关于注解方面的知识. Annotation是从JDK5.0开始引入的新技术 Annotation的作用: -不是程序本身,可以对程序做出解释(这一点和注释没什么区别) -可以被 ...

  3. [JAVA] 注解学习@interface

    一直都看框架级的代码中都是各种annotation,一起来看看到底怎么弄的 例子1:直接定义一个annotation,并使用之: package com.base.annotation.example ...

  4. Java注解学习

    一.注解定义 JVM5.0定义了4个标准的元注解: @Target, @Retention, @Documented @Inherited 1. @Target 作用:用于描述注解的使用范围 取值El ...

  5. java注解学习笔记总结

    注解的理解 ① jdk 5.0 新增的功能 ② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation,程序 ...

  6. java注解使用总结

    2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解编写代码,能够减轻java程序员繁琐配置的痛苦. 使用注解可以编写出更加易于维护,bug更少的代码. 注解是什么 ...

  7. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  8. 深入学习JAVA注解-Annotation(学习过程)

    JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...

  9. Java注解系统学习与实战

    背景 为什么要再次梳理一下java注解,显而易见,因为重要啊.也是为研究各大类开源框架做铺垫,只有弄清楚Java注解相关原理,才能看懂大部分框架底层的设计. 缘起 注解也叫做元数据,是JDK1.5版本 ...

随机推荐

  1. fedora 18 源码编译 android 4.0.1

    1.编译环境: 系统:fedora 18 KED 桌面  (Fedora-18-i686-Live-KDE.iso) 处理器:酷睿i5双核 内存: 4GB 硬盘:46GB java版本:java ve ...

  2. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET

    基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...

  3. Office 2016九大新功能

    Office 2016将于2015年秋季正式公布,下面是九大新功能. 预測 基于数据透视表的时间分组建模 联机分析(OLAP)下的PowerView 数据透视表(PivotTable)建模的自己主动关 ...

  4. Doxgen+Graphiz+htmlhelp配置

    查看一些开源码常常被一些函数的调用关系给绕进去.找个工具生成个调用关系图或简单的文档对于帮助阅读程序有非常大的帮助. 1 doxgen+graphviz+htmlhelp简单介绍 1.1 doxgen ...

  5. JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?!

    JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?! 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...

  6. Android数据库高手秘籍(一)——SQLite命令

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...

  7. Linux/UNIX之信号(2)

    信号(2) sigaction函数 sigaction函数的功能是检查或改动与制定信号相关联的处理动作.此函数代替了signal函数. #include <signal.h> int si ...

  8. 在Mybatis中使用注解@多个參数查询

    @Select("SELECT * FROM wc_homework WHERE organization_id=#{classId} ORDER BY createtime DESC LI ...

  9. poj1679(最小生成树)

    传送门:The Unique MST 题意:判断最小生成树是否唯一. 分析:先求出原图的最小生成树,然后枚举删掉最小生成树的边,重做kruskal,看新的值和原值是否一样,一样的话最小生成树不唯一. ...

  10. java 线程 ProducerAndConsumer

    package j2se.thread.demo; /** * <p>Project:J2SE 的基础知识</p> * <p>Tile:多线程模拟 生产者 和 消费 ...