Java 编程的动态性, 第四部分: 用 Javassist 进行类转换
2010-03-18 00:00:00 来源:WEB开发网取决于源代码中的内容,甚至可以让 Javassist 生成无效的字节码。清单7展示了这样的一个例子,其中我将 JassistTiming 代码修改为总是认为计时的方法返回一个 int 值。Javassist 同样会毫无问题地接受这个源代码,但是在我试图执行所生成的字节码时,它不能通过验证。
清单7. 将一个 String 储存到一个 int 中
[dennis]$ java -cp javassist.jar:. JassistTiming StringBuilder buildString
Interceptor method body:
{
long start = System.currentTimeMillis();
int result = buildString$impl($$);
System.out.println("Call to method buildString took " +
(System.currentTimeMillis()-start) + " ms.");
return result;
}
Added timing to method StringBuilder.buildString
[dennis]$ java StringBuilder 1000 2000 4000 8000 16000
Exception in thread "main" java.lang.VerifyError:
(class: StringBuilder, method: buildString signature:
(I)Ljava/lang/String;) Expecting to find integer on stack
只要对提供给 Javassist 的源代码加以小心,这就不算是个问题。不过,重要的是要认识到 Javassist 没有捕获代码中的所有错误,所以有可能会出现没有预见到的错误结果。
后续内容
Javassist 比我们在本文中所讨论的内容要丰富得多。下一个月,我们将进行更进一步的分析,看一看 Javassist 为批量修改类以及为在运行时装载类时对类进行动态修改而提供的一些特殊的功能。这些功能使 Javassist 成为应用程序中实现方面的一个很棒的工具,所以一定要继续跟随我们了解这个强大工具的全部内容。
更多精彩
赞助商链接