java注解的好处
注解的好处在于可以使代码简洁化。特别是在框架中。注解的使用可以代替XML的使用。实现代码的简洁化。
java注解分类
按来源分:java自带注解、第三方注解、自定义注解
按生命周期分:源码注解、编译时注解、运行时注解
自定义注解的结构:元注解(用来注解注解的)
接口定义、无参无异常的成员方法的定义(成员类型受限:基本数据类型、String、枚举)
JDK自带注解
@Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法, 编译器就会发出错误提示。
@Deprecated,修饰过时的方法。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。
@Suppvisewarnings,关闭不当的编译器警告信息
@Override 表示这个方法是重写的
@Deprected 表示指示的程序元素是不赞成程序员使用的,如果程序元素被使用,则会有警告。
@Suppvisewarnigs 表示忽略程序元素的警告 比如@Suppvisewarnings(“deprected”) 或者
@Suppvisewarnings(value={"",""}) @Suppvisewarnings({})
自定义注解
成员类型是受限的,合法的类型包括原始类型及String,Calss,Anootation,Enumreation
如果注解已有一个成员,则成员名必须取名为Vaue(),在使用的时可以忽略成员名和赋值号(=)
注解类可以没有成员,没有成员的注解成为表示注解
元注解
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})
// Target 注解的作用域 CONSTRUCTOR 构造方法声明,FIELD 字段声明,LOCAL_VARIABLE 局部变量声明 ,METHOD 方法声明,PACKAGE 包声明,PARAMETER 参数声明,TYPE 类接口。
@Retention(RetentionPolicy.RUNTIME)
//Retention 生命周期 SOURCE 只在源码显示,编译时会丢弃,CLASS 编译时会记录到class中,运行时忽略,RUNTIME 运行时存在,可以通过反射读取。
@Inherited
//Inherited 允许子类继承
@Documented 生成javadoc的时候包含注解
@Target 注解的作用域。
@Retention 生命周期。
@Inherited 允许子类继承
@Documented 生成javadoc时会包含注解
@Target({ElementType.METHOD,}) //作用域 @Retention(RetentionPolicy.RUNTIME) //生命周期 @Inherited //标识注解(允许子类继承) @Documented //生成javadoc会生成注解信息 public @interface Description { //1.类型受限制,包括基本类型及String、Class、Annotation、Enumeration //2.若只有一个成员,则名称必须为value(),使用时可以忽略成员名和赋值号(=) //3.注解类可以没有成员,称为标识注解 //4成员无参且无异常声明 String desc(); String author(); //5可指定默认值 int age() default 18; }
具体代码实现:通过注解,实现sql语句的拼接。可用于Hibernate,以及框架。
1.创建数据库表结构
//表一
@Table("user") public class Filter { @Column("u_id") private int u_id; @Column("u_password") private String u_password; @Column("u_email") private String u_email; //生成get,set方法 }
//表二
@Table("admin") public class Filter1 { @Column("adminId") private int adminId; @Column("adminName") private String adminName; @Column("adminPassword") private String adminPassword; //生成get,set方法 }
2。创建注解类(注解表)
//注解域,类
@Target(ElementType.TYPE) //生命周期。在运行时刻 @Retention(RetentionPolicy.RUNTIME) public @interface Table { String value(); } //注解表的列,也就是成员变量 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); }
3.测试类
public class Test { public static void main(String[] srgs){ Filter f1 = new Filter(); Filter f2 = new Filter(); Filter1 filter2 = new Filter1();//测试多张表的情况 f1.setU_id(10);//查询id为10的用户 f2.setU_name("whoami");//查询姓名为whoami filter2.setAdminPassword("123456"); String sql1 = query(f1); String sql2 = query(f2); String filter2Sql= query(filter2); System.out.println(filter2Sql); System.out.println(sql1); System.out.println(sql2); } //用于拼接sql语句的方法,Object.---->表类(针对不同的表类) private static String query(Object f){ /** * String 字符串常量 * StringBuffer 字符串变量(线程安全) * StringBuilder 字符串变量(非线程安全) */ //用于拼接字符串 StringBuilder sb = new StringBulder(); //得到类 Class c = f.getClass(); //得到表名,判断是否存在注解 boolean b = c.isAnnotationPreaent(Table.class); if(!b){ return null; } Table t = c.getAnnotation(Table.class); String tableName = t.value(); System.out.println("tableName---> "+tableName) //为什么加上1=1.是为了后面没有查询条件时不会报错 sb. append("SELECT FROM ").append(tableName).append( " WHERE 1=1 " ); //查询到了表名,当有条件查询时。我们要获得字段名,就是表里面的属性, //下一步。遍历字段字段信息,相当于成员变量 Field [] fArray = c.getDeclearedFields(); for(Field field : fArry){ boolean b1 = field.getAnnotationPreaent(Column.class); if(!b1){ continue; } ` //获得字段名从而得到方法名 Column c = field.getAnnotation(Column.class); Stirng fName = c.value(); System.out.,print("字段名:“+fName); ` //String fieldName = field.getName();得到成员变量 String getMethodName = "get"+fName.substring(0,1).toUpperCase()+fName.substring(1); System.out.println(getMethodName); 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; } sb.append(" and ").append(filedName); if(fieldValue instanceof String){ if(((String) fieldValue).contains(",")){ String[] value = ((String) fieldValue).split(","); sb.append("in ("); for (String string : value) { sb.append("' ").append(string).append(" ',"); } sb.deleteCharAt(sb.length()-1); sb.append(")"); }else{ sb.append(" = ").append("'").append(fieldValue).append("'"); } }else{ sb.append(" = ").append(fieldValue); } } return sb.toString(); } } }