一、Java注解基础知识点
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
二、JAVA 注解
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。
三、元数据的作用
如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查
四、读取注解信息的方法
属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度
注意:要想使用反射去读取注解,必须将Retention的值选为Runtime
```Java代码
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
//读取注解信息
public class ReadAnnotationInfoTest {
public static void main(String[] args) throws Exception {
// 测试AnnotationTest类,得到此类的类对象
Class c = Class.forName("com.iwtxokhtd.annotation.AnnotationTest");
// 获取该类所有声明的方法
Method[] methods = c.getDeclaredMethods();
// 声明注解集合
Annotation[] annotations;
// 遍历所有的方法得到各方法上面的注解信息
for (Method method : methods) {
// 获取每个方法上面所声明的所有注解信息
annotations = method.getDeclaredAnnotations();
// 再遍历所有的注解,打印其基本信息
System.out.println(method.getName());
for (Annotation an : annotations) {
System.out.println("方法名为:" + method.getName() + "其上面的注解为:" + an.annotationType().getSimpleName());
Method[] meths = an.annotationType().getDeclaredMethods();
// 遍历每个注解的所有变量
for (Method meth : meths) {
System.out.println("注解的变量名为:" + meth.getName());
}
}
}
}
}
五、代码实例
package com.test;
@Table("user")
public class Filter {
@Column("id")
private int id;
@Column("userName")
private String userName;
@Column("nickName")
private String nickName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package com.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
package com.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
```package com.test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class FilterTest {
public static void main(String[] args) {
Filter f1=new Filter();
f1.setId(10);//查询ID为10的用户
Filter f2=new Filter();
f2.setUserName("lucy");//模糊查询用户名为Lucy的用户
Filter f3=new Filter();
f3.setEmail("785713526@qq.com,liu@sina.com,7777@qq.com");
String sql1=query(f1);
String sql2=query(f2);
String sql3=query(f3);
}
private static String query(Filter f) {
StringBuilder stringBuilder=new StringBuilder();
//获取到class
Class c=f.getClass();
//获取到Table的名字
boolean exists = c.isAnnotationPresent(Table.class);
if (!exists){
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
String tableName=t.value();
stringBuilder.append("select * from ").append(tableName).append("where 1=1");
//遍历所有的字段
Field[] fArray=c.getDeclaredFields();
for (Field field:fArray){
//处理每个字段对应的SQL
//拿到字段名
boolean fExists=field.isAnnotationPresent(Column.class);
if(!fExists){
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName=column.value();
//拿到字段的值
String filedName=field.getName();
String getMethodName="get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
Object fieldValue=null;
try {
Method getMethod=c.getMethod((getMethodName));
fieldValue=getMethod.invoke(f);
} catch (Exception e) {
e.printStackTrace();
}
//拼接SQL
if (fieldValue==null||(fieldValue instanceof Integer&&(Integer)fieldValue==0)) continue;
stringBuilder.append(" and ").append(filedName);
if (fieldValue instanceof String){
if (((String) fieldValue).contains(",")){
String[] values=((String) fieldValue).split(",");
stringBuilder.append(" in(");
for (String v : values){
stringBuilder.append("'").append(v).append("'").append(",");
}
stringBuilder.deleteCharAt(stringBuilder.length()-1);
stringBuilder.append(")");
}else {
stringBuilder.append("=").append("'").append(fieldValue).append("'");
}
} else if (fieldValue instanceof Integer){
stringBuilder.append("=").append(fieldValue);
}
}
System.out.println(stringBuilder.toString());
return stringBuilder.toString();
}
}