java - 构造时通过反射获取Java中的静态实例名称

标签 java reflection

我不确定这是否是减少写入字符数的正确方法,但仍然如此。

现在我有以下代码片段,映射到两个设置源:数据库和.properties 文件:

import lombok.*;

@Getter
@ToString
@EqualsAndHashCode
public final class Setting<T> {
    private String id;
    private Class<T> clazz;  

    private Setting(final String id, final Class<T> clazz) {
        this.id = id;
        this.clazz = clazz;
    }

    public static final Setting TOKEN_LENGTH = new Setting("TOKEN_LENGTH", Integer.class);
    // lots of other settings
}

问题是,我想避免将第一个参数显式传递给构造函数,例如例如名为 TOKEN_LENGTH 的变量已将 id TOKEN_LENGTH 传递给它。换句话说,当这些static Final变量被实例化时,它们的第一个参数始终是所述变量的名称。

在本例中,仅创建了约 60 个此类实例,并且仅在应用程序启动时发生这种情况,因此由反射引起的任何开销都是可以接受的。

我想知道是否有任何方法可以重写构造函数,使其看起来像

    private Setting(final Class<T> clazz) {
        this.id = /* some crazy reflection magic */
        this.clazz = clazz;
    }

所以,问题是:

➥ 顺便问一下,有什么方法可以获取正在实例化并分配对象的静态变量的名称吗?

更新:

有一个解决方案,首先实例化所有变量,然后依次设置id字段。我仍在寻找在构造函数中“原子地”执行此操作的方法。

最佳答案

这样做相对容易,问题是知道使用哪个字段。您可以用注释来标记它,这样会更容易。类似的东西

public String getFieldName(){
    Field[] fields = getClass().getDeclaredFields();
    for(Field f: fields){
        if(f.isAnnotationPresent(YourAnnotation.class)){
             return f.getName();
        }
    }
    // do whatever if a valid field wasn't found
}

如果您不需要注释,那么您必须找到其他方法来识别它,例如唯一的静态字段。但这是非常糟糕的做法,使用注释更好。

关于java - 构造时通过反射获取Java中的静态实例名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655689/

相关文章:

java - 如何使用 Java REST 服务和数据流下载文件

Java-EE-6 : How to store a boolean in a @ManyToMany and @ManyToOne relationships?

java - 更改 Java 中被调用方法内使用的对象的属性

objective-c - iOS 模糊文本 : detecting & solving it once and for all?

.net - .Net 中的反射可以通过查看用户定义的类型名称来帮助动态构建表值参数/SqlMetaData [] 对象吗?

java - 将列表中的对象变量匹配并设置到不同的对象列表

java - 如何使用 BindBeans 将字符串列表输入到 SQL

Java项目架构

c# - 使用 Reflection.Emit 从 SqlDataReader 填充可空类型

c# - 直接从 C# 中作为不同类方法中的参数传递的成员方法之一检索类实例的引用