java注解如何自动触发?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java注解如何自动触发?相关的知识,希望对你有一定的参考价值。
例如:在PO中定义一个字段像这样
@validaterNum(max="10",min=5)
private String score;
然后有一个注解处理器
NumValidater
//处理注解的值,验证失败抛出异常
void validateNum(String source,int max ,int min)
//dosomething
问题就是如何在我组装完成这个PO时,就自动触发我的注解处理器的验证方法,当验证不能通过时就自动抛出异常?
使用Java注解开发自动生成SQL
使用注解开发的好处就是减少配置文件的使用。在实际过程中,随着项目越来越复杂,功能越来越多,会产生非常多的配置文件。但是,当配置文件过多,实际维护过程中产生的问题就不容易定位,这样就会徒劳的增加工作量。而使用注解开发,可以减少配置文件的使用,方便代码的维护,同时,在开发速度上也有大幅提升,因此,学会使用注解开发,是有必要掌握的一项技能。
下面为各位展示下使用注解开发自动生成SQL语句的过程。
首先先定义一个实体类,用于和数据库字段进行映射,为了方便,数据库字段名称和实体类变量名称保持一致。
package com.huawei.andrid.net.annotation; @Table("person") public class Person { @Column("name") private String name; @Column("sex") private String sex; @Column("id") private int id; @Column("age") private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
下面我们要为这个实体类定义注解,包含@Table和@Column两个注解。
package com.huawei.andrid.net.annotation; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Documented @Retention(RUNTIME) @Target(TYPE) public @interface Table { public String value(); }
元注解:
@Documented 生成javadoc时,支持注解
@Retention(RUNTIME) 注解的生命周期
@Target(TYPE) 注解的在类上
package com.huawei.andrid.net.annotation; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Documented @Retention(RUNTIME) @Target(FIELD) public @interface Column { public String value(); }
最后,我们需要解析注解,使用java的反射机制。
private static String query(Object p) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { StringBuilder str = new StringBuilder(); //通过反射获取Class对象,以便获取注解的值 Class<? extends Object> obj = p.getClass(); //判断该对象的类上有没有注解@Table boolean isExistsTable = obj.isAnnotationPresent(Table.class); if (!isExistsTable) { return null; } //获取Table注解,并获取注解的值,即表名 Table table = (Table) obj.getAnnotation(Table.class); String tableName = table.value(); //拼装sql str.append("select * from ").append(tableName).append(" where 1=1 "); //获取所有的成员变量,并遍历出来成员变量上的注解值 Field[] fields = obj.getDeclaredFields(); for (Field field : fields) { Boolean isExistColumn = field.isAnnotationPresent(Column.class); if (!isExistColumn) { continue; } //获取成员变量上的注解值 Column column = field.getAnnotation(Column.class); String columnName = column.value(); //获取成员变量的get方法名 String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); //获取成员变量的get方法 Method method = obj.getMethod(methodName); //执行成员变量的get方法,参数为该对象 Object value = method.invoke(p); //过滤掉成员变量中的null值,以及0 if (null == value || (value instanceof Integer && (Integer) value == 0)) { continue; } str.append(" and ").append(columnName).append("=").append(value); } return str.toString(); }
测试:
public static void main(String[] args) { Person p = new Person(); p.setName("wanglu"); p.setAge(25); String querySQL = null; try { querySQL = query(p); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } System.out.println(querySQL); }
以上是关于java注解如何自动触发?的主要内容,如果未能解决你的问题,请参考以下文章
Springbean的自动装配,使用注解开发,使用Java的方式配置Spring
java自定义事件,线程a如何每一秒钟触发一个事件,然后另一个线程b监听之,并作出反应?