获取字段值而无需使用超类中的导入?

时间:2014-12-02 15:21:43

标签: java reflection

我对Java编程比较陌生。我需要使用Reflection获取字段值。我当前的代码看起来像这样(其中超类是一组扩展MySuperClass)的类:

for (Class<? extends MySuperClass> s : subclasses) {
    try {
        field = s.getDeclaredField("MY_FIELD");
        fieldValue = (String) field.get(null);
    } catch ...

我的问题是,每当我调用field.get时,都会收到错误,因为找不到类org.slf4j.LoggerFactory。这是从哪里来的?好吧,MySuperClass导入它。我不知道为什么Java认为有必要拥有它,因为我希望获得MY_FIELD值的类不要导入它。当然,他们扩展MySuperClass(这是抽象的,如果重要的话)。那么有没有办法 从特定的类中获取字段值,而不依赖于超类使用的类?我不需要实例化类或其他东西,只需要获得该值......

我希望我能够很好地解释我的问题是什么,并为我的小Java知识道歉。

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

每个班级都取决于

  • 关于它的所有超类,以及它们中任何一个所依赖的所有东西;
  • 在它实现的所有接口上,以及它们中任何一个所依赖的所有接口上;
  • 在所有类和接口上表示其类,实例或局部变量的类型,其方法的参数类型或其方法的返回类型;和
  • 表示任何上述类型的类型参数边界的所有类和接口。

为了检查类的静态变量,调用其静态方法或实例化它,必须首先加载该类。为了加载一个类,还必须加载它的所有依赖项。

使用反射并没有解决上述任何问题,所以基本答案是否定的,没有加载超类的依赖关系就无法读取类的静态变量的值。