自定义注解(方法调用实现)

直接上代码…

说明:这个数据库只存在用户id,我们想知道用户的名字,这是这个注解放在类下的字段上(@FieldValue(type = FieldValueTypeEnum.USER,fieldBy = “updateBy”)) 然后通过有这个注解自动吧名字通过set方法放进实体类中

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FieldValue {
	/**
	 * 类型
	 *
	 * @return
	 */
	FieldValueTypeEnum type();
	/**
	 * 自定义service
	 *
	 * @return
	 */
	Class service() default Object.class;
	}
	//@Target  注解作用地址
	//(ElementType.TYPE)——接口、类、枚举、注解
	//(ElementType.FIELD)——字段、枚举的常量
	//(ElementType.METHOD)——方法
	//(ElementType.PARAMETER)——方法参数
	//(ElementType.CONSTRUCTOR) ——构造函数
	//(ElementType.LOCAL_VARIABLE)——局部变量
	//(ElementType.ANNOTATION_TYPE)——注解
	//(ElementType.PACKAGE)——包
	//(RetentionPolicy.RUNTIME) 标识注解的生命周期
	public enum RetentionPolicy {
    SOURCE, //只在源文件中,不编译到class文件中
    CLASS,  //编译到class中,运行被抛弃
    RUNTIME //只要你再用他就在
}
	//@Documented 1.该注解在javadoc中显示出来2.该注解一直存在(生命周期)3.该注解作用在注解上4.没啥屌用

定义一个handler接口

public interface FieldValueHandler {

	/**
	 * 获取值
	 * @param fieldValue 注解
	 * @param instance 类
	 * @return
	 */
	Object value(FieldValue fieldValue,Object instance);

}

定义方法(传进来一个对象)

private static Object setFieldValue(Object instance) {//所有数据都当做list处理

		Class<?> clazz = instance.getClass(); //反射获取class
		List<Field> fields = Arrays.stream(clazz.getDeclaredFields()).filter(e -> e.isAnnotationPresent(FieldValue.class)).collect(Collectors.toList()); //过滤没有这个注解的字段
		for (Field field : fields) { //所有数据有注解的属性,给每一个带有注解的赋值
			if (field.isAnnotationPresent(FieldValue.class)) {  //如果不加次判断也可以
				try {
					//获取注解type(这注解里边的type是枚举类可自定义)
					FieldValueTypeEnum type = field.getAnnotation(FieldValue.class).type();
					//获取实现bean
					FieldValueHandler fieldValueHandler = SpringUtil.getBean(type.getService(), FieldValueHandler.class);   //hutool方法 根据名字获取bean
					Object value = fieldValueHandler.value(field.getAnnotation(FieldValue.class),field,instance);
					//获取值注入entity
					ReflectUtil.invoke(instance,"set" + StrUtil.upperFirst(field.getName()),value);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return instance;
	}

handler实现

@Slf4j
@Component
@AllArgsConstructor
public class UserFieldValueHandler implements FieldValueHandler {
	private final Service service;


	@Override
	public Object value(FieldValue fieldValue, Field field,Object instance) {
		Object obj = ReflectUtil.invoke(instance, "get" + StrUtil.upperFirst(fieldValue.fieldBy()));//ReflectUtil是hutool的  执行方法(instance类,方法名字)StrUtil.upperFirst首字母大写
		R<SysUser> sysUser = service.getUserById((Integer) obj);
		if (sysUser=null && sysUser.getUsername()!=null){
		return sysUser.getUsername(); //返回用户名字
		}else {
			return "";
		}
	}
}

你可能感兴趣的:(一个菜鸟程序员想成为大牛)