如何使用Java中的反射确定字段是私有还是受保护?

时间:2018-03-13 14:45:36

标签: java reflection

从这个SO answer开始,我收集到的是,如果不设置setAccessible(true),则无法访问私有字段。我可以使用isAccessible()确定某个字段是否公开。但是,我如何确定它是公开的还是私人的?

4 个答案:

答案 0 :(得分:5)

您可以使用Field.getModifiers()获取字段修饰符。然后,您可以使用Modifier.is*查找:

int modifiers = field.getModifiers();

if(Modifier.isProtected(modifiers)) {
  // protected
}
else if(Modifier.isPrivate(modifiers)) {
  // private 
}

答案 1 :(得分:1)

鉴于此课程

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

答案 2 :(得分:0)

你弄错了。您不需要反射来访问公共字段。你可以直接访问它们,这就是为什么它们首先是公开的。

除此之外,你可以使用getModifiers并解析它。见Retrieving and Parsing Field Modifiers

答案 3 :(得分:0)

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()));
        }
    }