前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >注解支持@Alias同步值

注解支持@Alias同步值

作者头像
阿超
发布2022-08-21 12:41:08
2890
发布2022-08-21 12:41:08
举报
文章被收录于专栏:快乐阿超快乐阿超

首先是这个issue希望AnnotationUtil增加对@AliasFor的支持

然后我就提交了这个PR提供AnnotationUtil#getAnnotationAlias,为@Alias注解做别名支持的适配

代码如下(找不到方法可以去看hutool源码):

代码语言:javascript
复制
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;

import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.*;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;

/**
 * 注解工具类<br>
 * 快速获取注解对象、注解值等工具封装
 *
 * @author looly
 * @since 4.0.9
 */
public class AnnotationUtil {

	/**
	 * 获取别名支持后的注解
	 *
	 * @param annotationEle  被注解的类
	 * @param annotationType 注解类型Class
	 * @param <T>            注解类型
	 * @return 别名支持后的注解
	 */
	@SuppressWarnings("unchecked")
	public static <T extends Annotation> T getAnnotationAlias(AnnotatedElement annotationEle, Class<T> annotationType) {
		T annotation = getAnnotation(annotationEle, annotationType);
		Object o = Proxy.newProxyInstance(annotationType.getClassLoader(), new Class[]{annotationType}, (proxy, method, args) -> {
			Alias alias = method.getAnnotation(Alias.class);
			if (ObjectUtil.isNotNull(alias) && StrUtil.isNotBlank(alias.value())) {
				Method aliasMethod = annotationType.getMethod(alias.value());
				return ReflectUtil.invoke(annotation, aliasMethod);
			}
			return method.invoke(args);
		});
		return (T) o;
	}
    
}

最终效果路哥进行了一些调整

然后使用方式也很简单,我们写一个注解,然后给它用一个@Alias别名,关联我们注解中另一个属性:

代码语言:javascript
复制
package cn.hutool.core.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用于单元测试的注解类<br>
 * 注解类相关说明见:https://www.cnblogs.com/xdp-gacl/p/3622275.html
 *
 * @author looly
 *
 */
// Retention注解决定MyAnnotation注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
// Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface AnnotationForTest {

	/**
	 * 注解的默认属性值
	 *
	 * @return 属性值
	 */
	String value() default "";

	@Alias("value")
	String retry() default "";
}

然后我们把这个注解加在一个类上面

代码语言:javascript
复制
@AnnotationForTest("测试")
static class ClassWithAnnotation{
    public void test(){
    }
}

我们来获取这个Class上注解的值

代码语言:javascript
复制
@Test
public void getAnnotationSyncAlias() {
	// 直接获取
	Assert.assertEquals("", ClassWithAnnotation.class.getAnnotation(AnnotationForTest.class).retry());

	// 加别名适配
	AnnotationForTest annotation = AnnotationUtil.getAnnotationAlias(ClassWithAnnotation.class, AnnotationForTest.class);
	Assert.assertEquals("测试", annotation.retry());
}

大家可以很明显地看出来,这里我们默认给AnnotationForTest上的value赋值,但我们取retry,因为我们加了@Alias注解且使用了getAnnotationSyncAlias方式获取,所以我们取到的retry值实际上是value的值,两者进行了同步

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档