2016-11-15 42 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()回报补丁的类的对象,而不是原来的。

相关问题