【发布时间】:2018-08-21 21:14:18
【问题描述】:
从这个SO answer,我收集到如果不设置setAccessible(true),您将无法访问私有字段。我可以使用isAccessible() 确定一个字段是否为公共字段。但是,我如何确定它是公共的还是私有的?
【问题讨论】:
-
检查modifiers。
标签: java reflection
从这个SO answer,我收集到如果不设置setAccessible(true),您将无法访问私有字段。我可以使用isAccessible() 确定一个字段是否为公共字段。但是,我如何确定它是公共的还是私有的?
【问题讨论】:
标签: java reflection
您可以使用Field.getModifiers() 来获取字段修饰符。然后您可以使用Modifier.is* 查找:
int modifiers = field.getModifiers();
if(Modifier.isProtected(modifiers)) {
// protected
}
else if(Modifier.isPrivate(modifiers)) {
// private
}
【讨论】:
if(int)。
给定这个类
class MyClass {
public String v1;
protected String v2;
private String v3;
}
你可以这样检查修饰符
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
Field field;
int modifier;
field = MyClass.class.getDeclaredField("v1");
modifier = field.getModifiers();
System.out.println(Modifier.toString(modifier));
field = MyClass.class.getDeclaredField("v2");
modifier = field.getModifiers();
System.out.println(Modifier.toString(modifier));
field = MyClass.class.getDeclaredField("v3");
modifier = field.getModifiers();
System.out.println(Modifier.toString(modifier));
打印出来:
public
protected
private
【讨论】:
你错了。您不需要反射来访问公共字段。您可以直接访问它们,这就是它们首先是公开的原因。
除此之外,您还可以使用 getModifiers 并对其进行解析。见Retrieving and Parsing Field Modifiers
【讨论】:
public class Model {
public int pub;
private int priv;
}
和
public static void main(String[] args) {
Field[] fields = Model.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName() + " : " + Modifier.toString(field.getModifiers()));
}
}
【讨论】: