采用javassist来将一个类中的field改变类型。待改变的类代码如下:
[code="java"]public class JassistTest {
@Autowired
private StpService stpService;
public void doit(Long userid){
PeakSeasonMainResponse res = stpService.getPeakOverView(userid);
System.out.println(stpService.getClass().getName());
System.out.println("hello" + res);
}
}[/code]
进行改变操作的类如下:
[code="java"]public class TestMain {
public TestMain(){
}
public static void main(String[] args) throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("JassistTest");
CtField f = cc.getDeclaredField("stpService");
cc.removeField(f);
cc.addField(CtField.make("private Proxy stpService;", cc));
cc.writeFile("D:\\DevProgram\\eclipse-jee-kepler-R-win32\\workspace\\stable\\fc-deimos\\target\\test-classes");
JassistTest test = new JassistTest();
test.doit(7060L);
}
}
[/code]
class文件生成后,我用反编译工具查看,Javassist已经变为如下:
[code="java"]public class JassistTest
{
private Proxy stpService;
public void doit(Long userid)
{
PeakSeasonMainResponse res = this.stpService.getPeakOverView(userid);
System.out.println(this.stpService.getClass().getName());
System.out.println("hello" + res);
}
}[/code]
但当我执行TestMain.java文件中的test.doit()方法时,还是报异常了。
[code="java"]Exception in thread "main" java.lang.NoSuchFieldError: stpService
at JassistTest.doit(JassistTest.java:13)
at TestMain.main(TestMain.java:33)
[/code]
实在搞不懂,请教大家