java 注解 学习
周末闲来无事,想要研究一下注解方面的知识,曾经看过几次,都忘记了,这次学习下,而且写篇文章记录下,
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 注解 学习的更多相关文章
- Java注解学习笔记
我们平常写Java代码,对其中的注解并不是很陌生,比如说写继承关系的时候经常用到@Override来修饰方法.但是@Override是用来做什么的,为什么写继承方法的时候要加上它,不加行不行.如果对J ...
- java注解学习(1)注解的作用和三个常用java内置注解
今天,记录一下自己学习的关于注解方面的知识. Annotation是从JDK5.0开始引入的新技术 Annotation的作用: -不是程序本身,可以对程序做出解释(这一点和注释没什么区别) -可以被 ...
- [JAVA] 注解学习@interface
一直都看框架级的代码中都是各种annotation,一起来看看到底怎么弄的 例子1:直接定义一个annotation,并使用之: package com.base.annotation.example ...
- Java注解学习
一.注解定义 JVM5.0定义了4个标准的元注解: @Target, @Retention, @Documented @Inherited 1. @Target 作用:用于描述注解的使用范围 取值El ...
- java注解学习笔记总结
注解的理解 ① jdk 5.0 新增的功能 ② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation,程序 ...
- java注解使用总结
2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解编写代码,能够减轻java程序员繁琐配置的痛苦. 使用注解可以编写出更加易于维护,bug更少的代码. 注解是什么 ...
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...
- 深入学习JAVA注解-Annotation(学习过程)
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...
- Java注解系统学习与实战
背景 为什么要再次梳理一下java注解,显而易见,因为重要啊.也是为研究各大类开源框架做铺垫,只有弄清楚Java注解相关原理,才能看懂大部分框架底层的设计. 缘起 注解也叫做元数据,是JDK1.5版本 ...
随机推荐
- 13年7月13日CF练习 Codeforces Round #147 (Div. 2)
这场div2可以说是我见过的比较水的一场吧.基本都是一眼题. 比赛地址http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=1836 题号是237A-237 ...
- Java对象序列化/反序列化的注意事项(转)
Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...
- VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式
原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...
- C++--allocator类的使用
C++为我们提供了安全的内存空间申请方式与释放方式,可是new与delete表达式却是把空间的分配回收与对象的构建销毁紧紧的关联在一起.实际上,作为与C语言兼容的语言,C++也为我们提供了更加底层的内 ...
- ExtJs 设置GridPanel表格文本垂直居中
业务场景,需要实现最终效果图如下: GridPanel代码如下配置: { xtype : 'grid', id : 'grid_jglb', frame : true, region : 'cente ...
- C#操作Cookie
/* 创建者:菜刀居士的博客 * 创建日期: 2014年09月02号 * 功能:操作Cookie * */ namespace Net.String.ConsoleApplication { ...
- HDU 3830 Checkers
意甲冠军: 有三件 所有其他棋子可以跳 不能分开的两个跳跃 当被问及状态u为了国家v最低短跳转 思路: 对于一个状态三个棋子的位置能够设为 x y z (小到大) 仅仅有当y-x=z-y的时候 ...
- 为了找到自己的路——leo锦书62
<Leo锦书(文章1编辑)>百度已经降落阅读,今后将继续更新.免费下载:http://t.cn/RvawZEx 柯克•卡梅隆是谁呢?在中国听过这名字的人预计不多.但看下封面我们马下就会说: ...
- linux下执行strlwr函数出错:ld returned 1 exit status
执行strlwr函数时报错.源程序例如以下: #include<stdio.h> #include<string.h> void main() { char s[10]={&q ...
- windows接口被占用
netsh winsock reset 重启winsock服务