【问题标题】:Java method introspection from JRuby来自 JRuby 的 Java 方法自省
【发布时间】:2010-06-01 22:40:01
【问题描述】:

JRuby 有没有一种方法可以内省 Java 对象并找出其 Java 领域的方法?就像 http://github.com/oggy/looksee 提供的一样,但对于 Java。或者喜欢

(someobject).methods - 1.methods

这对于查看 Java 对象提供的内容和 APIDoc 提供的内容会很好。

【问题讨论】:

    标签: java ruby jruby


    【解决方案1】:

    Looksee 修补了解释器,这就是它只适用于 MRI 和 YARV 而不适用于 JRuby、XRuby、IronRuby、Ruby.NET、Rubinius、tinyrb、RubyGoLightly、MacRuby、HotRuby、BlueRuby、Cardinal、MagLev、SmallRuby 的原因、Red Sun 和所有其他实现。

    所以,如果你愿意修补 HotSpot,我相信你可以开发一个 Java 等效的 :-)

    至于您的基本内省,它只是有效™:

    require 'java'
    java.lang.String.public_instance_methods.sort.reject {|m| m =~ /[_?!=~<>]/ }
    # => [:bytes, :charAt, :class, :clone, :codePointAt, :codePointBefore, 
    # => :codePointCount, :com, :compareTo, :compareToIgnoreCase, :concat, 
    # => :contains, :contentEquals, :display, :dup, :empty, :endsWith, :equals, 
    # => :equalsIgnoreCase, :extend, :finalize, :freeze, :getBytes, :getChars, 
    # => :getClass, :hash, :hashCode, :id, :indexOf, :initialize, :inspect, :intern, 
    # => :isEmpty, :java, :javax, :lastIndexOf, :length, :matches, :method, 
    # => :methods, :notify, :notifyAll, :offsetByCodePoints, :org, :regionMatches, 
    # => :replace, :replaceAll, :replaceFirst, :send, :split, :startsWith, 
    # => :subSequence, :substring, :synchronized, :taint, :tap, :toCharArray, 
    # => :toLowerCase, :toString, :toUpperCase, :trim, :trust, :type, :untaint, 
    # => :untrust, :wait]
    

    当然,JRuby 的重点之一是尽可能紧密地集成 Java 和 Ruby 对象模型,因此我们实际上在这里得到 both Java 和 Ruby 方法,但是通过拒绝所有在 Java 中具有异常或明显非法字符的方法,我们得到了一个相当干净的列表,并且其余的 Ruby 方法并不难发现。

    【讨论】:

      【解决方案2】:

      使用底层 Java 类和普通反射只获取 Java 方法:

      java.lang.String.java_class.declared_instance_methods
      

      这直接映射到Class.getDeclaredMethods() Java 方法调用,并为目标类上的每个Java 实例方法生成一个Java::JavaMethod 对象数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 2023-01-21
        • 2011-02-10
        相关资源
        最近更新 更多