JVM在校验阶段不检查接口的实现状况 - 编程入门网
bitescript。使用该库需要JRuby 1.2.0或更高的版本,我这次用的是JRuby 1.3.0RC2。
安装bitescript只要用JRuby的gem就行: Command prompt代码 gem install bitescript JVM在校验阶段不检查接口的实现状况(3)时间:2012-01-03 javaeye RednaxelaFX然后编写生成字节码用的脚本: test.rb: Ruby代码 require ''rubygems'' require ''bitescript'' include BiteScript IFoo = Java::IFoo FooImpl = Java::FooImpl Bar = Java::Bar fb = FileBuilder.build(__FILE__) do public_class ''TestInterfaceCall'' do public_static_method ''main'', void, string[] do # IFoo f = new FooImpl(); new FooImpl dup invokespecial FooImpl, ''<init>'', [void] astore 1 # f.method(); aload 1 invokeinterface IFoo, ''method'', [void] # Bar b = new Bar(); new Bar dup invokespecial Bar, ''<init>'', [void] astore 2 # ((IFoo)b).method(); aload 2 ## checkcast IFoo # skip the cast to trigger IncompatibleClassChangeError invokeinterface IFoo, ''method'', [void] returnvoid end end end fb.generate do |filename, class_builder| File.open(filename, ''w'') do |file| file.write(class_builder.generate) end end 可以对比一下直接用ASM时的代码,显然用bitescript要简洁易懂得多。Good job, Charles! 执行这个脚本,把生成出来的TestInterfaceCall.class与前面的IFoo.class、FooImpl.class和Bar.class放在同一个目录下。然后运行java TestInterfaceCall, Command prompt代码 D:\sdk\jruby-1.3.0RC2\test_bitescript>java TestInterfaceCall FooImpl.method() Exception in thread "main" java.lang.IncompatibleClassChangeError at TestInterfaceCall.main(test.rb) 可以看到程序打印出了"FooImpl.method()"这句话,也就是说异常是在运行时而不是链接时抛出的。 如今用到Java的字节码改写/动态生成的工具已经很普遍了,如果在使用它们的时候不够小心,相信这里所提到的运行时异常也会有机会见到的 =v= P.S. 我这次运行的环境是: D:\sdk\jruby-1.3.0RC2\test_bitescript>java -version java version "1.6.0_11" Java(TM) SE Runtime Environment (build 1.6.0_11-b03) Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |