You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:02