C#的AttributeUsage(AttributeTargets.Property)对应的Java等价实现是什么
C# DefaultField特性迁移Java注解解决方案
Java注解的属性类型仅支持基本类型、String、枚举、注解、Class及上述类型的数组,不支持直接声明Object类型的参数,因此无法完全复刻C#的传参写法,可通过多属性+默认占位值的方式实现等价效果。
1. 定义DefaultField注解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 布尔值专用枚举,解决默认false无法识别的问题 enum BoolDefault { UNSET, TRUE, FALSE } @Retention(RetentionPolicy.RUNTIME) // 改为RUNTIME才能在运行时通过反射读取 @Target(ElementType.FIELD) // 如果要支持get/set方法可以新增ElementType.METHOD public @interface DefaultField { // 各类型参数都设置专属占位默认值,用于判断是否被用户主动设置 double doubleVal() default Double.NaN; int intVal() default Integer.MIN_VALUE; long longVal() default Long.MIN_VALUE; String stringVal() default ""; BoolDefault booleanVal() default BoolDefault.UNSET; // 可根据业务需要自行扩充其他支持的类型 }
2. 注解使用示例
和原C#写法几乎一致,仅需指定对应类型的参数名:
// 对应原C# [DefaultField(1.0)] @DefaultField(doubleVal = 1.0) public double windowSize; // 对应原C# [DefaultField("Summary")] @DefaultField(stringVal = "Summary") public String windowTitle; // 对应原C# 无参构造 [DefaultField],HasDefaultValue为false @DefaultField public String emptyField;
3. 运行时读取注解的工具方法
通过反射读取注解内容,即可获得对应原C#的HasDefaultValue和DefaultValue:
import java.lang.reflect.Field; public class DefaultFieldUtils { public static Object getDefaultValue(Field field) { if (!field.isAnnotationPresent(DefaultField.class)) { return null; } DefaultField anno = field.getAnnotation(DefaultField.class); boolean hasDefaultValue = false; Object defaultValue = null; // 依次判断各类型参数是否被主动设置 if (!Double.isNaN(anno.doubleVal())) { hasDefaultValue = true; defaultValue = anno.doubleVal(); } else if (anno.intVal() != Integer.MIN_VALUE) { hasDefaultValue = true; defaultValue = anno.intVal(); } else if (anno.longVal() != Long.MIN_VALUE) { hasDefaultValue = true; defaultValue = anno.longVal(); } else if (!anno.stringVal().isEmpty()) { hasDefaultValue = true; defaultValue = anno.stringVal(); } else if (anno.booleanVal() != BoolDefault.UNSET) { hasDefaultValue = true; defaultValue = anno.booleanVal() == BoolDefault.TRUE; } // 按需返回hasDefaultValue和defaultValue即可 return hasDefaultValue ? defaultValue : null; } }
可选扩展:支持自定义类型
如果需要支持自定义类、枚举等特殊类型,可以在注解中新增序列化属性:
// 新增到DefaultField注解中 String rawValue() default ""; Class<?> valueType() default Void.class;
使用时填写序列化后的字符串和对应类型,工具方法中通过JSON反序列化即可拿到对应实例。
内容的提问来源于stack exchange,提问作者user17410860
相关产品推荐
相关产品推荐

