我不确定这是否是减少写入字符数的正确方法,但仍然如此。
现在我有以下代码片段,映射到两个设置源:数据库和.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/