【问题标题】:How do I determine if a field is private or protected using reflection in Java? [duplicate]如何使用 Java 中的反射确定字段是私有的还是受保护的? [复制]
【发布时间】:2018-08-21 21:14:18
【问题描述】:

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

【问题讨论】:

标签: java reflection


【解决方案1】:

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

int modifiers = field.getModifiers();

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

【讨论】:

  • Java 不允许你写if(int)
【解决方案2】:

给定这个类

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

【讨论】:

    【解决方案3】:

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

    除此之外,您还可以使用 getModifiers 并对其进行解析。见Retrieving and Parsing Field Modifiers

    【讨论】:

    • 我认为 OP 想知道随机变量是否使用反射是公共/受保护/私有的,而不是访问该变量的值。可用于创建自制文档;)
    • 你是对的。我的意思是把“私人”而不是“公共”。固定。
    【解决方案4】:
    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()));
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 2012-01-16
      • 2012-01-22
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 2010-10-21
      • 2012-01-11
      相关资源
      最近更新 更多