仅检索在 Java 类中声明的静态字段
Posted
技术标签:
【中文标题】仅检索在 Java 类中声明的静态字段【英文标题】:Retrieve only static fields declared in Java class 【发布时间】:2011-03-26 05:49:57 【问题描述】:我有以下课程:
public class Test
public static int a = 0;
public int b = 1;
是否可以使用反射来仅获取静态字段的列表?我知道我可以使用Test.class.getDeclaredFields()
获得所有字段的数组。但似乎无法确定 Field
实例是否代表静态字段。
【问题讨论】:
我是java新手,我想知道为什么Java没有像C#一样把这些特性都放在Field类中,这样设计有什么好处?谢谢。 docs.oracle.com/javase/8/docs/api/java/lang/reflect/… 【参考方案1】:你可以这样做:
Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields)
if (java.lang.reflect.Modifier.isStatic(field.getModifiers()))
staticFields.add(field);
【讨论】:
【参考方案2】:如果您可以将开源依赖项添加到您的项目中,您也可以使用 FieldUtils.readDeclaredStaticField(Test.class,"a")
【讨论】:
这并没有给出静态字段的列表。【参考方案3】:这很简单,你可以使用修饰符来检查一个字段是否是静态的。 这是此类任务的示例代码。
public static void printModifiers(Object o)
Class c = o.getClass();
int m = c.getModifiers();
if (Modifier.isPublic(m))
System.out.println ("public");
if (Modifier.isAbstract(m))
System.out.println ("abstract");
if (Modifier.isFinal(m))
System.out.println ("final");
if(Modifier.isStatic(m))
System.out.println("static");
【讨论】:
【参考方案4】:我偶然发现了这个问题,觉得它需要使用流更新 Java 8:
public static List<Field> getStatics(Class<?> clazz)
List<Field> result;
result = Arrays.stream(clazz.getDeclaredFields())
// filter out the non-static fields
.filter(f -> Modifier.isStatic(f.getModifiers()))
// collect to list
.collect(toList());
return result;
显然,为了便于阅读,该示例进行了一些修饰。实际上,您可能会这样写:
public static List<Field> getStatics(Class<?> clazz)
return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
Modifier.isStatic(f.getModifiers())).collect(toList());
【讨论】:
“实际上,您可能会这样写”......为什么您认为“实际上”可读性并不重要? 首先,我认为在这样的网站上嘲笑别人的英语是不合适的。除此之外,我不认为修饰示例中的 cmets 有助于提高即使对流非常熟悉的人的可读性,也没有无用的返回变量。如果我在实际代码中遇到它们,我会考虑这两种噪音。凭借我对流的更多经验,我今天会选择保留原始换行符以提高可读性。没有人是完美的。我的目标是为新程序员提供一个明确的示例以及一个现实的示例。 我不是在嘲笑你的英语。你的英语很好。我什至不明白你在说什么。是的,我同意 cmets 是多余的,第一个的格式要好得多。我的观点是,当可读性是一个非常重要的代码质量指标时,您似乎建议“为可读性而修饰”是不好的。以上是关于仅检索在 Java 类中声明的静态字段的主要内容,如果未能解决你的问题,请参考以下文章
KotlinKotlin 与 Java 互操作 ② ( @JvmField 注解字段给 Java | @JvmOverloads 注解修饰函数 | @JvmStatic 注解声明静态成员 )