2016-11-15 3 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() возвращает объект класса исправленной, а не оригинал.