JAVA注解学习
2015-07-30 21:40
706 查看
最近通过观看慕课网,学习了java注解,趁热打铁对java注解进行整理:
慕课网视频:http://www.imooc.com/learn/456
生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;
跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;
在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。
源码注解:注解只在源码中存在,编译成.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=”,直接写需要的值即可。
使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)
如果成员是数组类型,可以通过{}进行赋值,如boolean数组的成员可以设置为{true,false,true}。下面是几个注解标注的例子:
多成员的注解
一个成员的注解,成员名为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是枚举类型的成员。
参考网站: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
慕课网视频: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