2013-04-07 123 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