2016-11-15 40 views
0

我有以下代碼:javasisst - 不編譯由於「失蹤」字段

CtClass player = ClassPool.getDefault().get("org.spongepowered.api.entity.living.player.Player"); 
CtField toAdd = CtField.make("public java.lang.String nick = null;", player); 
player.addField(toAdd); 

,後來我有這樣的:

e.getTargetEntity()/*this function returns a class that implements Player*/ 
Player.nick = e.getTargetEntity().getName(); 

我怎樣才能使此代碼編譯? eclipse和maven都會拋出異常,因爲顯然,他們不知道Player.nick是一個字段。任何幫助表示讚賞。

回答

0

您必須使用反射來設置字段。

package hello; 

import com.thoughtworks.xstream.XStream; 
import javassist.ClassPool; 
import javassist.CtClass; 
import javassist.CtField; 

class Player { 
} 

class Main { 
    public static void main(String[] args) throws Exception { 
     CtClass player = ClassPool.getDefault().get("hello.Player"); 
     CtField toAdd = CtField.make("public java.lang.String nick = null;", player); 
     player.addField(toAdd); 

     Class patchedPlayer = player.toClass(); 
     Object o = patchedPlayer.newInstance(); 

     patchedPlayer.getField("nick").set(o, "hello, Player"); 

     String s = new XStream().toXML(o); 
     System.out.println(s); 
    } 
} 

將打印

<hello.Player> 
    <nick>hello, Player</nick> 
</hello.Player> 

還要確保e.getTargetEntity()回報補丁的類的對象,而不是原來的。

相關問題