注解是在程序的源文件,编译时及运行中提供元数据为java在原有的强大功能下构建更灵活的程序;
即在源码中,类文件以及运行时提供元数据。
java注解的分类从两个角度分,从提供方来说:第一类为java平台自带的,第二类为第三方库,第三类为自定义。从状态的角度来说:分为源码注解,类注解,运行时注解;
自定义注解
一 定义:
@Target({ElementType,TYPE}) //注解能放置的位置
@Retention(RetentionPolicy.RUNTIME) //注解起作用的范围
@Inherited //子类可用
@Document //文档可用
public @interface Table{
String value();
}
@Target({ElementType,FIELD,...}) //注解能放置的位置
@Retention(RetentionPolicy.RUNTIME) //注解起作用的范围
@Inherited //子类可用
@Document //文档可用
public @interface Column{
int id();
int age();
boolean gender();
String name() default "xiaoming"; // 注解类型和注解名 表明注解类型,注解的名字 default 指定默认值
}
@Target 中ElementType的种类:
PACKAGE TYPE CONSTRUCT METHOD FIELD PARAMETER LOCAL_VARIABLE
@Retention 中的RetentionPolicy
SOURCE CLASS RUNTIME
二,使用:
@Table("student")
public class student{
@Column("id")
private int id;
@Column("age")
private int age;
@Column("name")
private String name;
}
使用实现片段代码:
package org.seehunter.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.management.Query;
import javax.xml.bind.ValidationEvent;
public class Test {
public static void main(String[] args) {
Filter filter=new Filter();
String sql=query(filter);
System.out.println(sql);
}
public static String query(Filter ft) {
StringBuilder sb=new StringBuilder();
Class c=ft.getClass();
boolean exists=c.isAnnotationPresent(Table.class);
if(!exists) {
return null;
}
Table t=(Table)c.getAnnotation(Table.class);
String tableName=t.value();
sb.append("select * from ").append(tableName).append(" where 1=1");
Field[] fArray=c.getDeclaredFields();
for(Field field:fArray) {
boolean fExists=field.isAnnotationPresent(Column.class);
if(!fExists) {
continue;
}
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(ft);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
//sb.append(" and ").append(fieldName).append("=").append(fieldValue);
//advanced
if(fieldValue==null
|| fieldValue instanceof Integer &&(Integer)fieldValue==0) {
continue;
}
sb.append(" and ").append(fieldName);
if(fieldValue instanceof String) {
sb.append("=").append("'").append(fieldValue).append("'");
}else if(fieldValue instanceof Integer) {
sb.append("=").append(fieldValue);
}
}
return sb.toString();
}
}
具体使用请参见
框架基础——全面解析Java注解