@Override public String name() { return null; }
@Deprecated public void sing();
@SuppressWarnings("deprecation") public void sing(){ Person p = new child(); p.sing(); }
@Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Description{// 使用@interface关键字定义注 解 String desc();//成员以无参无异常方式声明 String author(); int age() default 18;//可以用default为成员指定一个默认值 }
//注解作用域(构造方法、局部变量、方法声明、包声明类接口等) @Target({ElementType.METHOD,ElementType.TYPE}) //注解的生命周期(源码、编译时、运行时) @Retention(RetentionPolicy.RUNTIME) //表示注解允许子类继承 @Inherited //表示生成javadoc时会包含注解 @Documented
@Description(desc="zy",author="boy",age=18) public String eyeColor(){ return "red"; }这样,@Description注解就在eyeColor()方法上使用
//1、使用类加载器加载类 try { Class c = Class.forName ("com.ann.test.child"); //2、找到类上面的注解(判断指定类上是否存 在Description这个注解) boolean isExist = c.isAnnotationPresent (Description.class); if(isExist){ //3、拿到注解实例 Description d = (Description) c.getAnnotation(Description.class); System.out.println(d.value()); } //4、找到方法上的注解 //首先遍历所有的方法 Method[] ms = c.getMethods(); for (Method m : ms) { //判断是否有注解 boolean isMExist = m.isAnnotationPresent(Description.class); if (isMExist) { //如果存在则使用注解 Description md = (Description)m.getAnnotation(Description.class); System.out.println (md.value()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); }
此时运行不输出任何东西
原因是: @Inherited对于接口继承不起作用package com.zy.test; @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 nickNameString) { this.nickName = nickNameString; } 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; } }
package com.zy.test; public class Test { 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 ("[email protected],[email protected],[email protected]");//查询邮箱为其中任意一个 的用户 //调用query进行查询 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){ return null; } }
package com.zy.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.zy.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.zy.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Iterator; public class Test { public static void main(String[] args) { Filter f1 = new Filter(); f1.setId(10);//查询id为10的用户 Filter f2 = new Filter(); f2.setUserName("lucy");//查询用户名为lucy的用户 f2.setAge(19); Filter f3 = new Filter(); f3.setEmail ("[email protected],[email protected],[email protected]");//查询邮箱为其中任意一个 的用户 //调用query进行查询 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、获取到class Class c = f.getClass(); //2.通过注解获取到table的名字 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) { //4.处理每个字段对应的sql //4.1 拿到字段名 boolean fExists = field.isAnnotationPresent (Column.class); if (!fExists) {//如果不是数据库字段 continue; } Column column = (Column)field.getAnnotation (Column.class); String columnNameString = column.value(); //4.2 拿到字段的值(通过反射取得get方法的名字,然 后通过反射区调用这个方法,就取得字段值) String filedName = field.getName(); //把get加上字段名首字母大写 filedName.substring(0, 1).toUpperCase(),把首字母之后的名字内容拼 装上filedName.substring(1),就拼装成get方法 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 //如果字段值为空或者字段值在int类型时为0 fieldValue instanceof Integer && (Integer)fieldValue == 0,将不作 处理 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 v : value) { 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(); } }
Department.java: package com.zy.test; @Table("department") public class Department { @Column("id") private int id; @Column("name") private String name; @Column("leader") private String leader; @Column("number") private int number; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLeader() { return leader; } public void setLeader(String leader) { this.leader = leader; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } }
Department d = new Department(); d.setId(1); d.setLeader("kkk"); d.setNumber(111); System.out.println(query(d));