Java注解实例
目錄
?
?
理論
例子
?
理論
注解的作用范圍:@Target
生命周期:@Retention
作用范圍:包、類、字段、方法、方法的參數、局部變量
生命周期:源文件SOURCE、編譯CLASS、運行RUNTIME
?
例子
這里來一個簡單的實例(本實例來源與mooc網,本人只是抄了一遍,和進行了簡單的修改,在此感謝下mooc的老師)
程序運行截圖如下:
程序結構如下:
Column.java
package my;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(); }Filter.java
package my;@Table("user") public class Filter {@Column("id")private int id;@Column("user_name")private String userName;@Column("nick_name")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 getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getNickName() {return nickName;}public void setNickName(String nickName) {this.nickName = nickName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;} }Table.java
package my;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(); }Test.java
package my;import java.lang.reflect.Field; import java.lang.reflect.Method;public class Test {public static void main(String[] args) {Filter f1 = new Filter();f1.setId(10);Filter f2 = new Filter();f2.setUserName("lucy");Filter f3 = new Filter();f3.setEmail("liu@sina.com, zh@163.com, 77777@qq.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);}private static String query(Filter f) {StringBuilder sb = new StringBuilder();//1. 獲取到注解@SuppressWarnings("rawtypes")Class c = f.getClass();//2. 獲取table的名字@SuppressWarnings("unchecked")boolean exists =c.isAnnotationPresent(Table.class);if(!exists) {return null;}@SuppressWarnings("unchecked")Table t = (Table)c.getAnnotation(Table.class);String tableName = t.value();sb.append("select * from ").append(tableName).append(" where 1 = 1");//3. 遍歷所有的字段Field[] fArray = c.getDeclaredFields();for(Field field : fArray) {//4. 處理每個字段對應的sql//4.1 拿到字段名boolean fExists = field.isAnnotationPresent(Column.class);if(!fExists) {continue;}Column column = field.getAnnotation(Column.class);@SuppressWarnings("unused")String columnName = column.value();//4.2 拿到字段的值,用反射得到字段String filedName = field.getName();String getMethodName = "get" + filedName.substring(0, 1).toUpperCase() +filedName.substring(1);//通過反射取得值Object fieldValue = null;try {@SuppressWarnings("unchecked")Method getMethod = c.getMethod(getMethodName);fieldValue = getMethod.invoke(f);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//4.3 拼裝sqlif(fieldValue == null ||(fieldValue instanceof Integer &&(Integer)fieldValue == 0)) {continue;}sb.append(" and ").append(filedName);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("'").append(",");}sb.deleteCharAt(sb.length() - 1);sb.append(")");}else {sb.append("=").append("'").append(fieldValue).append("'");}}else if(fieldValue instanceof Integer) {sb.append("=").append(fieldValue);}}return sb.toString();} }這里我對注解的感悟,感覺是一個flag,通過這個flag,可以為每一個類,類中成員,標識一個項目需要的東西。
?
總結
- 上一篇: C++笔记-使用sprintf把各个类型
- 下一篇: 系统架构师学习笔记-论文摘要部分的写法