2012-02-12 17 views
0

我想運行一個客戶端和訪問字段來設置/獲取值。在腳本啓動時,我創建了一個加載了URLClassLoader的客戶類的新實例,並將其指定給gameApplet。現在NPE反射

,接下來的一段代碼工作正常(訪問靜態字段):

Class<?> clientClass = clientClassLoader.loadClass("client"); 
fps = clientClass.getDeclaredField("fpsOn"); 
fps.setAccessible(true); 
fps.set(null, true); 

但後來,當我試圖訪問一個非靜態字段:

logged = clientClass.getField("loggedIn"); 
logged.set(gameApplet, true); 

我得到這個錯誤

java.lang.NullPointerException 
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source) 
    at sun.reflect.UnsafeBooleanFieldAccessorImpl.set(Unknown Source) 
    at java.lang.reflect.Field.set(Unknown Source) 
    at launch.run(launch.java:206) 
    at java.lang.Thread.run(Unknown Source) 

我假設它的實例是null,但爲什麼它會得到一個靜態字段?

+0

請不要用'OK'或'So'開始句子。如果你刪除那些無用的術語,這句話就會讓每一點都有意義。 – 2012-02-12 08:01:04

回答

4

你似乎沒有創建類的「實例」。您需要調用該類的構造函數,然後在需要的地方使用該實例。

上面的代碼適用於靜態字段,因爲它們可以從類中訪問,即它們不需要實例。

+0

這應該怎麼做?我認爲我做對了,我只是沒有顯示: – user1204813 2012-02-12 08:16:50

+0

gameApplet =(Applet)clientClass.newInstance(); – user1204813 2012-02-12 08:17:42

+0

@ user1204813當你調用set(null,true)時會出現異常。所以可能你在調用set之後分配gameApplet? – 2012-02-12 08:48:00