您的位置:首页 > 编程语言 > Java开发

JAVA注解学习

2015-07-30 21:40 706 查看
最近通过观看慕课网,学习了java注解,趁热打铁对java注解进行整理:

慕课网视频:http://www.imooc.com/learn/456

1、什么是java注解

java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:

生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;

跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;

在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;

注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。

2、注解分类

注解按照运行机制划分。

源码注解:注解只在源码中存在,编译成.class文件就不存在了;

编译时注解:注解在源码和.class文件中都存在(例:JDK自带注解 @Override);

运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解;

常用注解:JDK内置系统注解:

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

@Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。

@SuppressWarnings,关闭不当编译器警告信息。

java四种元注解

注解的注解

@Target

@Target 表示该注解用于什么地方,可取的值包括:

ElemenetType.CONSTRUCTOR     构造器声明

ElemenetType.FIELD          域声明(包括 enum 实例)

ElemenetType.LOCAL_VARIABLE    局部变量声明

ElemenetType.METHOD         方法声明

ElemenetType.PACKAGE        包声明

ElemenetType.PARAMETER       参数声明

ElemenetType.TYPE          类,接口(包括注解类型)或enum声明

ElementType.ANNOTATION_TYPE   注解

@Retention

@Retention 表示在什么级别保存该注解信息。可选的

RetentionPolicy 参数包括:

RetentionPolicy.SOURCE       注解将被编译器丢弃

RetentionPolicy.CLASS        注解在class文件中可用,但会被VM丢弃

RetentionPolicy.RUNTIME       JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

@Documented

@Documented 将此注解包含在 javadoc 中

@Inherited

@Inherited 允许子类继承父类中的注解

自定义注解

注解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。

3、使用注解

下面是一个使用注解注解的实例。

@Description(value="使用注解的实例")
public class TestAnnotation {
}


使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)

如果成员是数组类型,可以通过{}进行赋值,如boolean数组的成员可以设置为{true,false,true}。下面是几个注解标注的例子:

多成员的注解

@AnnoExample(id= 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody")


一个成员的注解,成员名为value

可以省略成员名和赋值符号:

@Copyright(“Right Reserved”)

@Copyright(“2011 bookegou.com All Right Reserved”)

无成员的注解

@Override

成员为字符串数组的注解

@SuppressWarnings(value={“unchecked”,”fallthrough”})

@SuppressWarnings(value={“unchecked”,”fallthrough”})

成员为注解数组类型的注解

@Reviews({@Review(grade=Review.Grade.EXCELLENT,reviewer=”df”),

@Review(grade=Review.Grade.UNSATISFACTORY,reviewer=”eg”,

comment=”This method needs an @Override annotation”)})

@Reviews({@Review(grade=Review.Grade.EXCELLENT,reviewer=”df”), @Review(grade=Review.Grade.UNSATISFACTORY,reviewer=”eg”,

comment=”This method needs an @Override annotation”)})

@Reviews注解拥有一个@Review注解数组类型的成员,@Review注解类型有三个成员,其中reviewer、comment都是String类型,但comment有默认值,grade是枚举类型的成员。

4、解析注解

下面是一个解析注解的实例。

package java2015.java07.java.anno;
/**
* @author baoyou  E-mail:curiousby@163.com
* @version 创建时间:2015年7月23日 下午2:51:27
* des:
*/
@Table("student")
public class Filter {

@Column("id")
private int stuId;
@Column("name")
private String stuName;
@Column("email")
private String email;

public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}

}


package java2015.java07.java.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @author baoyou  E-mail:curiousby@163.com
* @version 创建时间:2015年7月23日 下午2:54:47
* des:
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}


package java2015.java07.java.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @author baoyou  E-mail:curiousby@163.com
* @version 创建时间:2015年7月23日 下午2:54:22
* des:
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public String value();
}


package java2015.java07.java.anno;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* @author baoyou  E-mail:curiousby@163.com
* @version 创建时间:2015年7月23日 下午3:19:11
* des:
*/
public class Test {

public static void main(String[] args) {

Filter f1 = new Filter();
f1.setStuId(10);

Filter f2 = new Filter();
f2.setStuId(10);
f2.setStuName("baoyou");

Filter f3 = new Filter();
f3.setEmail("1223716098@qq.com,curiousby@163.com");

String sql1 = query(f1);
String sql2 = query(f2);
String sql3 = query(f3);

System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}

@SuppressWarnings("unchecked")
private static String query(Filter f) {
StringBuffer sb = new StringBuffer();
Class c=  f.getClass();
boolean isExist = c.isAnnotationPresent(Table.class);
if (!isExist) {
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
String  tableName = t.value();
sb.append(" select * from ").append(tableName).append(" 1=1 ");
Field[] fArray = c.getDeclaredFields();
for (Field field : fArray) {
boolean fExist = field.isAnnotationPresent( Column.class);
if (!fExist) {
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
String fieldName = field.getName();
String getMethodName = "get" +fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
Object fieldValue=null;
try {
Method getMethod =c.getMethod(getMethodName);
fieldValue = getMethod.invoke(f);
} catch (Exception e) {
}
if (fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0) ) {
continue;
}
sb.append(" and ").append( columnName );
if (fieldValue instanceof String){
if (((String) fieldValue ).contains(",")) {
String[] values = ((String) fieldValue ).split(",");
sb.append(" in ( ");
for (String v : values) {
sb.append("'").append(v).append("',");
}
sb.deleteCharAt(sb.length()-1);
sb.append(" )");
} else{
sb.append(" = '").append(fieldValue).append("' ");
}
}else if (fieldValue instanceof Integer){
sb.append(" = ").append(fieldValue).append(" ");
}

}
return sb.toString();
}
}




参考网站:http://knight-black-bob.iteye.com/blog/2229834

http://www.open-open.com/lib/view/open1353144218545.html

http://www.cnblogs.com/yejg1212/p/3187362.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java注解