反思地看变量名,而不是值
Reflectively look at a variable name, rather than value
鉴于 class:
class Statics {
public static String LOC_MY_SELECTOR;
static void find(String selector) {
System.out.println(selector);
}
public static void main(String...args) {
find(LOC_MY_SELECTOR);
}
}
我如何才能在 System.out.println
处获取字段名称而不是值?值为null
,当然会打印出null。我想做的是:
find(LOC_MY_SELECTOR); // to print "LOC_MY_SELECTOR" instead of the value `null`
这可能吗?
答案是"yes you can."
我通过在 class 构造函数中填充静态字段来解决这个问题。然后每次后续引用,该字段将已经设置。
class Statics {
public static String LOC_MY_SELECTOR;
public Statics() {
Field[] fields = getClass().getDeclaredFields();
for (Field field : fields) {
int mods = field.getModifiers();
if (field.getType() == String.class &&
!Modifier.isFinal(mods) &&
Modifier.isStatic(mods) &&
Modifier.isPublic(mods) &&
field.getName().startsWith("LOC_")
) {
String fieldName = field.getName();
field.setAccessible(true);
try {
// homepage_
String translation = fieldName.split("_", 2)[1].toLowerCase();
field.set(field, translation);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
static void find(String selector) {
System.out.println(selector);
}
public static void main(String...args) {
find(LOC_MY_SELECTOR);
// will print "my_selector" now
}
}
鉴于 class:
class Statics {
public static String LOC_MY_SELECTOR;
static void find(String selector) {
System.out.println(selector);
}
public static void main(String...args) {
find(LOC_MY_SELECTOR);
}
}
我如何才能在 System.out.println
处获取字段名称而不是值?值为null
,当然会打印出null。我想做的是:
find(LOC_MY_SELECTOR); // to print "LOC_MY_SELECTOR" instead of the value `null`
这可能吗?
答案是"yes you can."
我通过在 class 构造函数中填充静态字段来解决这个问题。然后每次后续引用,该字段将已经设置。
class Statics {
public static String LOC_MY_SELECTOR;
public Statics() {
Field[] fields = getClass().getDeclaredFields();
for (Field field : fields) {
int mods = field.getModifiers();
if (field.getType() == String.class &&
!Modifier.isFinal(mods) &&
Modifier.isStatic(mods) &&
Modifier.isPublic(mods) &&
field.getName().startsWith("LOC_")
) {
String fieldName = field.getName();
field.setAccessible(true);
try {
// homepage_
String translation = fieldName.split("_", 2)[1].toLowerCase();
field.set(field, translation);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
static void find(String selector) {
System.out.println(selector);
}
public static void main(String...args) {
find(LOC_MY_SELECTOR);
// will print "my_selector" now
}
}