2013-04-07 48 views
1

我想修改一个公共静态最终字符串[]字段,我在ClassA中,然后修改它在ClassB中使用反射。但是,我得到一个NoSuchFieldException。Java NoSuchFieldError当使用反射

java.lang.NoSuchFieldException: test 
at java.lang.Class.getField(Unknown Source) 
at packageA.ClassA.<init>(ClassA.java:17) 

ClassA位于packageAClassB位于packageB如果该事项。

Class A,创建领域,并呼吁ClassB

package packageA; 

import packageB.ClassB; 

public class ClassA { 
    // Create final String[] 
    public static final String[] test = new String[] {"Test1", "Test2", "Test3"}; 

    public ClassA() { 
     // Output array content before change 
     for (int i = 0; i < test.length; i++) { 
      System.out.println(test[i]); 
     } 

     // Change array content 
     try { 
      new ClassB(String[].class.getField("test"), new String[] {"Change1", "Change2", "Change3"}); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Output array content after change 
     for (int i = 0; i < test.length; i++) { 
      System.out.println(test[i]); 
     } 
    } 
} 

B类,修改了 '测试' 数组:

package packageB; 

import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 

public class ClassB { 

    public ClassB(Field field, Object newValue) { 
     try { 
      field.setAccessible(true); 

      Field modifiersField = Field.class.getDeclaredField("modifiers"); 
      modifiersField.setAccessible(true); 
      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

      field.set(null, newValue); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

注:我从here了ClassB的,我也看到了this后但我找不到任何有用的东西。

从我从that的主题中收集到的信息,我认为这个异常意味着它不知道ClassB中'test'是什么,并且我还没有在ClassB中初始化它,但我无法真正地那个。

+0

使用'new ClassB(ClassA.class.getField(“test”),.....'而不是 – 2013-04-07 19:51:03

回答

3

String[].class.getField("test")将抛出一个NoSuchFieldException,因为该字段不存在于String[]中,它存在于packageA.ClassA中。

ClassA.class.getField("test")将返回正确的字段访问权限。

+0

啊,我明白了,这很明显,谢谢 – Snakybo 2013-04-07 19:56:15

+0

谢谢[Paul](http:// stackoverflow .com/users/697449/paul-bellora),我的英文真的很接近;-) – Aubin 2013-04-07 19:59:01