0 0

javassist一个很奇怪的问题0

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

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


进行改变操作的类如下:
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已经变为如下:

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()方法时,还是报异常了。
Exception in thread "main" java.lang.NoSuchFieldError: stpService
	at JassistTest.doit(JassistTest.java:13)
	at TestMain.main(TestMain.java:33)


实在搞不懂,请教大家
2013年8月20日 20:48

1个答案 按时间排序 按投票排序

1 0

采纳的答案

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

2013年8月20日 21:09

相关推荐

    javassist官方手册(中文)

    Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。下面是一个详细的知识点总结: 一、Javassist 概述 Javassist是一个 Java 字节码操作类库,用于生成、修改和加载 Java 字节码。...

    开发工具 javassist-3.21.0-GA

    开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...

    javassistDemo.zip

    这个"javassistDemo.zip"压缩包提供了一个示例,展示了如何利用Javaassist库动态修改Java类的方法。在Java应用程序中,这种能力非常有用,特别是在进行AOP(面向切面编程)或者在无法重新编译源代码的情况下需要修改...

    Javassistjar包

    avassist是一个开源的分析、编辑和创建Java字节码的...javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

    javaagent+javassist

    javassist是一个开源的Java字节码操作库,它可以动态修改类的字节码,实现运行时代码增强。开发者无需理解复杂的字节码格式,只需使用javassist提供的API,就可以轻松地添加、删除或修改类的方法、字段甚至整个类。...

    javassist-3.23.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    javassist-3.19.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.19.0-GA.jar; 赠送原API文档:javassist-3.19.0-GA-javadoc.jar; 赠送源代码:javassist-3.19.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.19.0-GA.pom; 包含翻译后的API文档...

    javassist-3.21.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.21.0-GA.jar; 赠送原API文档:javassist-3.21.0-GA-javadoc.jar; 赠送源代码:javassist-3.21.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.21.0-GA.pom; 包含翻译后的API文档...

    java 反编译工具 jboss-javassist

    这个文件很可能是Javassist的一个特定版本,包含必要的类库和可能的示例代码。要开始使用,可以按照以下步骤操作: 1. **导入依赖**:在Java项目中,将下载的Javassist库添加到类路径,如果是Maven项目,可以在pom....

    javassist-3.14.0-GA

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...

    javassist-3.24.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassist+jd-gui

    `javassist` 是一个开源库,全称为“Java ClassPool”,它允许程序员在运行时动态地修改类或者创建新的类。这个工具的强大之处在于,它提供了一种无需重新编译源代码就能改变Java类行为的方式。通过`javassist`,...

    javassist-3.18.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.18.1-GA.jar; 赠送原API文档:javassist-3.18.1-GA-javadoc.jar; 赠送源代码:javassist-3.18.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.18.1-GA.pom; 包含翻译后的API文档...

    javassist-3.27.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.27.0-GA.jar; 赠送原API文档:javassist-3.27.0-GA-javadoc.jar; 赠送源代码:javassist-3.27.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.27.0-GA.pom; 包含翻译后的API文档...

    javassist-3.18.1-GA.jar

    `javassist-3.18.1-GA.jar`是Javaassist的一个特定版本,GA代表“General Availability”,意味着这是一个正式发布的稳定版本。这个版本号`3.18.1`表明它是对之前版本的改进和增强,修复了已知问题并可能引入了一些...

    javassist-3.20.0-GA.zip

    这个"javassist-3.20.0-GA.zip"压缩包包含了Javaassist的3.20.0-GA版本,这是一个兼容JDK8的版本。自这个版本之后,Javaassist开始转向支持JDK9及以上版本。 Javaassist的工作原理是基于字节码操作。Java字节码是...

    javassist包

    javassist包

    javassist-3.24.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassist-3.23.1-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    javassist-3.18.2-GA.jar

    javassist-3.18.2-GA.jar

Global site tag (gtag.js) - Google Analytics