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时,就自动触发我的注解处理器的验证方法,当验证不能通过时就自动抛出异常?

没有自动触发一说, 总有那么一段程序都 把这些注解信息给提出来,然后跑它的功能。 只是说有些框架提供了这些功能,你不用自己去写了,只需要 配置就好了。 不同的框架是不一样的不能给我讲 参考技术A 在组装的时候就验证,在这个字段的setter方法中判断

使用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监听之,并作出反应?

自定义的Spring Boot starter如何设置自动配置注解

Java注解处理器

java注解@Resource机制怎么取到注入过的Bean

java注解@Resource机制怎么取到注入过的Bean