iteye_2355 2013-08-20 20:48
浏览 444
已采纳

javassist一个很奇怪的问题

采用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]

实在搞不懂,请教大家

  • 写回答

1条回答 默认 最新

  • suziwen 2013-08-20 21:09
    关注

    感觉跟classloader有关,
    试试这样,分开两次执行。第一次生成新的class,第二次把在path里直接使用新的class文件

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页