在构建过程中通过反射获取Java中的静态实例名称

在构建过程中通过反射获取Java中的静态实例名称,java,reflection,Java,Reflection,我不确定这是否是减少书写字符数的正确方法,但仍然如此 现在,我有一段代码映射到两个设置源:数据库和.properties文件: import lombok.*; @吸气剂 @托斯特林 @EqualsAndHashCode 公开期末课程设置{ 私有字符串id; 私人课堂; 私有设置(最终字符串id、最终类clazz){ this.id=id; this.clazz=clazz; } 公共静态最终设置令牌长度=新设置(“令牌长度”,Integer.class); //很多其他的设置 } 问题是,我

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

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

import lombok.*;
@吸气剂
@托斯特林
@EqualsAndHashCode
公开期末课程设置{
私有字符串id;
私人课堂;
私有设置(最终字符串id、最终类clazz){
this.id=id;
this.clazz=clazz;
}
公共静态最终设置令牌长度=新设置(“令牌长度”,Integer.class);
//很多其他的设置
}
问题是,我希望避免将第一个参数显式传递给构造函数,例如,名为
TOKEN\u LENGTH
的变量将id
TOKEN\u LENGTH
传递给它。换句话说,当实例化这些
静态final
变量时,它们的第一个参数始终是所述变量的名称

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

我想知道是否有办法重写构造函数,使其看起来像

私人设置(最后一节课){
this.id=/*一些疯狂的反射魔法*/
this.clazz=clazz;
}
因此,问题是:

➥ 顺便问一下,是否有任何方法可以获取正在实例化和分配对象的静态变量的名称

UPD:


有一种解决方案,它首先实例化所有变量,然后依次设置
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
}

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

所以在这种情况下id应该等于“设置”?@MatthewKerian我的意思是
公共静态最终设置设置设置A
id
应该是
设置A
,对于
公共静态最终设置,另一个\u-ONE
id
应为
另一个\u-ONE
。对不起,如果我的措辞很奇怪的话Dhanks,我也考虑过这个问题,但这会不会导致每个
公共静态final
字段都有一个唯一的注释?我的意思是,如果我有63个不同的设置变量,我不应该创建63个不同的注释来区分这些变量吗?@Xobotun如果它们都在不同的类中,就不应该。你可以在构造器中运行它。现在所有这些变量都在同一个类中。创建63个不同的类根本不行。另外,在
Setting.java
中已经有一些代码迭代所有静态字段,将其视为带有泛型的枚举。也许创建一个只有一个字段的匿名类就可以了,但是我该如何访问匿名类中的那个字段呢?。。现在我越来越倾向于认为这在Java中是不可能的(因此,您在同一个类中创建了63个静态设置变量。我认为这是唯一可能的。不要立即初始化ID。初始化所有静态字段后,遍历并循环每个字段,手动将ID的值设置为等于字段名称。是的,我认为这将是最好的。我希望不会出现这种情况。)有任何并发问题。谢谢。