2016-11-15 1 views
0

을 "실종"하는 I가 다음 코드를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(); 

가 어떻게이 코드를 컴파일 할 수 있습니까? 이클립스와 메이븐 모두 컴파일 예외를 발생시킵니다. 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() 반환 객체가 아니라 원래을 인쇄합니다.