最近通过观看慕课网,学习了java注解,趁热打铁对java注解进行整理:
慕课网视频:http://www.imooc.com/learn/456
java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:
生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;
跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;
在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。
注解按照运行机制划分。
源码注解:注解只在源码中存在,编译成.class文件就不存在了;
编译时注解:注解在源码和.class文件中都存在(例:JDK自带注解 @Override);
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解;
常用注解:JDK内置系统注解:
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 允许子类继承父类中的注解
自定义注解
下面是一个使用注解注解的实例。
@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
下面是一个解析注解的实例。
package java2015.java07.java.anno;
/**
* @author baoyou E-mail:[email protected]
* @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:[email protected]
* @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:[email protected]
* @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:[email protected]
* @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("[email protected],[email protected]");
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