2017-10-06 36 views
-1

我是新來的java和目前正在使用練習Reflection。錯誤:無法設置最終的int字段java.lang.Integer.value java.lang.Class

我有這樣的代碼:

try { 
    Class<?> c = Integer.class; 
    System.out.println("Name: " + c.getName());  
    System.out.println("Super Class: " + c.getSuperclass().getName()); 

    Class[] cl = c.getInterfaces(); 
    System.out.println("Interfaces list: "); 
    for(Class cls: cl) 
    { 
     System.out.println(cls.getName() + ", "); 
    } 

    System.out.println(""); 
    int i = c.getModifiers(); 
    System.out.println("Access modifiers: " + Modifier.toString(i)); 

    //----------- 
    System.out.println("\nMETHODS");   
    Method[] ms = c.getDeclaredMethods(); 
    for(Method m: ms) 
    { 
     System.out.println("Name: "+ m.getName()); 

    }  

    //------------ 
    System.out.println("\nFIELDS"); 
    Field [] flds = c.getDeclaredFields(); 
    for(Field f: flds) 
    { 
     System.out.println("Name: "+ f.getName()); 
     System.out.println("Data type: " + f.getType().getName()); 
     i = c.getModifiers(); 
     System.out.println("Acc modifiers: " + Modifier.toString(i)); 

     f.setAccessible(true); 
     Object value = f.get(c); 
     if (value != null) 
     { 
      System.out.println(f.getName() + "=" + value); 
     } 
     System.out.println("--------------"); 
    } 

    } 
    catch(Throwable e) 
    { 
     System.out.println("error: " + e.getMessage()); 

    } 


} 

但是,它給了我這是在標題中提到領域的「價值」的錯誤。請解釋錯誤,並告訴我們爲什麼必須寫'f.setAccessible(true); '(我通過互聯網看到)它的目的是什麼?

回答

1

Field.get(Object obj)的預期參數必須是該字段來自的類的實例。在這種情況下,它必須是Integer的一個實例,並且您使用的是Class<Integer>的實例,因此是錯誤。

setAccessible(true)用於使得場可以被訪問,即使它是不可訪問privateprotected

相關問題