注解的分类:(按照运行机制来分类)
1,源码注解
2,编译时注解(JDK自带注解: Override, Deprecated, Suppvisewarnings)
3,运行时注解 (在运行阶段起作用,可能会运行编译的逻辑,例如 Autowired)
按照来源分类:
1,JDK自带的注解
2,第三方的注解
3,自定义注解
自定义注解的语法:
成员类型是受限制的,只能是JAVA的8个基本类型,String,Class,Annotation,Enumberation。
可以没有成员,没有成员的注解称为标记注解。
public @interface Table {//用关键字@interface,成员以无参无异常的方式声明
/**
* 成员以无参无异常的方式声明
* @return
*/
String dec();
/**
* 只有一个成员时用规定用value(用其它的也不会报错)
* @return
*/
String value();
/**
* 可以用default设置一个默认值
* @return
*/
int age() default 18;
}
元注解:
1,注解的作用域
@Target ()
值:ElementType.Method 方法声明
ElementType.CONSTRUCTOR 构造方法声明
ElementType.FIELD 字段声明
ElementType.LOCAL_VARIABLE 局部变量声明
ElementType.PACKAGE 包声明
ElementType.PARAMETER 参数声明
ElementType.TYPE 类,接口声明
2,注解的生命周期
@Retention()
值:RetentionPolicy.SOURCE 只在源码中显示,编译时会丢弃
RetentionPolicy.CLASS 编译时会记录到CLASS中,
RetentionPolicy.RUNTIME 运行时存在,可以通过反射来读取
3,允许被子类继承
@Inherited
4,生成JAVADOC时会包含注解
@Documented
注解的使用方法:
@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,......)
eg:
@Desc(desc="hello", name="tom", age=18)
解析注解:
概念:通过反射获取类、函数或成员上的运行时(生命周期为RUNTIME)注解信息,从而实现动态控制程序运行的逻辑
这是一个拼接sql的函数
public static String f(User user){
StringBuffer sb = new StringBuffer();
//获取类
Class c = user.getClass();
//判断类上是否有注解Table
boolean tExist = c.isAnnotationPresent(Table.class);
if(!tExist){
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
//获取注解成员值
sb.append("select * from ").append(t.value()).append(" where 1 = 1 ");
//获取类的成员
Field[] fArray = c.getDeclaredFields();
//遍历成员
for (Field field : fArray) {
boolean fExist = field.isAnnotationPresent(Column.class);
if(!fExist){
continue;
}
//获取注解实例
Column col = field.getAnnotation(Column.class);
//获取注解成员值
String columnName = col.value();
String fieldName = field.getName();
//获取类中成员的get方法名
String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1, fieldName.length());
Method m;
Object columnValue;
try {
m = c.getMethod(methodName);
//执行方法,获取类中的成员值
columnValue = m.invoke(user);
if(columnValue == null){
continue;
}
sb.append(" and ").append(columnName).append(" = ");
if(columnValue instanceof String){
sb.append("'");
}
sb.append(columnValue);
if(columnValue instanceof String){
sb.append("'");
}
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sb.toString();
}