快速业务通道

JVM在校验阶段不检查接口的实现状况 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号