来自辅助类的字段的Java反射

时间:2017-12-12 18:52:09

标签: java reflection encapsulation

我想从多个类中使用以下泛型函数。问题是,如果我从帮助器类调用它,由于可见性,我无法获取字段对象。

public <T> List<T> descendingServices(Class<T> cls) {
  List<T> descendings = new ArrayList<>();

  for (Field field : EnvironmentServiceImpl.class.getDeclaredFields()) {
    Object obj;
    try {
      obj = field.get(this);
      if (cls.isInstance(obj)) {
        T descending = (T) obj;
        descendings.add(descending);
      }
    } catch (IllegalAccessException e) {
    }
  }

  return descendings;
}

我可以在不使用setAccessible字段的情况下以某种方式解决此问题吗?

1 个答案:

答案 0 :(得分:1)

如果您没有先使用反射,那么解决方案就是考虑如何访问该字段。然后,您可以在弄清楚如何访问数据后添加反射代码。

如果你不能访问该字段,因为它不是public,那么声明该字段的类应该声明一个public getter方法,为你访问该字段,为自己提供封装。 / p>

如有必要,将getter方法添加到类中。然后拨打Class的{​​{1}}方法,而不是getMethods。您可能需要绕过其他不想处理的方法。

来自Javadocs for getMethods

  

返回一个包含getDeclaredFields个对象的数组,这些对象反映了此Method对象所表示的类或接口的所有公共方法,包括由类或接口声明的那些以及从超类和超接口继承的那些。 / p>