开发者社区> 问答> 正文

javassist一个很奇怪的问题

采用javassist来将一个类中的field改变类型。待改变的类代码如下:

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);  
    }  
      
}

进行改变操作的类如下: 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);  
          
          
          
    }  
}

class文件生成后,我用反编译工具查看,Javassist已经变为如下:

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);  
  }  
}

但当我执行TestMain.java文件中的test.doit()方法时,还是报异常了。 Java代码 收藏代码

Exception in thread "main" java.lang.NoSuchFieldError: stpService  
    at JassistTest.doit(JassistTest.java:13)  
    at TestMain.main(TestMain.java:33)

展开
收起
长安归故里. 2020-01-08 16:03:10 884 0
1 条回答
写回答
取消 提交回答
  • 感觉跟classloader有关, 试试这样,分开两次执行。第一次生成新的class,第二次把在path里直接使用新的class文件 我用javassist在writefile的时候,是覆盖回classpath下的class文件,然后new的时候,classloader才去读取的吧?那时候已经重写完class文件了应该。
    这个我现在也不太确定,现在对classloader的具体顺序也是忘记差不多了。只是感觉你new的话,可能这个class定义 已经加载到内存里了,所以还是旧的class 我自己2了。class文件在生成时候已经记录field和method的相关信息了。如果改了field的类型,那么对应函数确实已经不能用了。

    2020-01-08 16:03:58
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载