2014-12-02 30 views
0

我对Java编程比较陌生。我需要使用反射来获取字段值。我当前的代码如下所示(其中超是一组扩展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知识而道歉。

非常感谢提前。

+2

'import'语句不会做你认为它的作用。它实际上并不包含任何东西。如果你得到一个'ClassNotFoundException',那么你已经加载/初始化的一些类需要它,而不是因为'import',而是因为它实际上使用了它。 – 2014-12-02 15:23:06

+1

堆栈跟踪和可重现的示例在这里会有所帮助。 – 2014-12-02 15:27:32

回答

2

每类依赖

  • 在它的所有超,并在其上的任何人都依赖;
  • 在它实现的所有接口上,以及它们所依赖的所有接口上;对所有表示其类,实例或局部变量,其方法的参数类型或其方法的返回类型的类和接口的所有类和接口,和
  • 上的所有类和接口,表示任何上述类型的类型参数边界。

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

反射的使用没有解决上述问题,所以基本答案是否定的,没有办法在不加载超类的依赖关系的情况下读取类的静态变量的值。