【发布时间】:2010-06-01 22:40:01
【问题描述】:
JRuby 有没有一种方法可以内省 Java 对象并找出其 Java 领域的方法?就像 http://github.com/oggy/looksee 提供的一样,但对于 Java。或者喜欢
(someobject).methods - 1.methods
这对于查看 Java 对象提供的内容和 APIDoc 提供的内容会很好。
【问题讨论】:
JRuby 有没有一种方法可以内省 Java 对象并找出其 Java 领域的方法?就像 http://github.com/oggy/looksee 提供的一样,但对于 Java。或者喜欢
(someobject).methods - 1.methods
这对于查看 Java 对象提供的内容和 APIDoc 提供的内容会很好。
【问题讨论】:
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 方法并不难发现。
【讨论】:
使用底层 Java 类和普通反射只获取 Java 方法:
java.lang.String.java_class.declared_instance_methods
这直接映射到Class.getDeclaredMethods() Java 方法调用,并为目标类上的每个Java 实例方法生成一个Java::JavaMethod 对象数组。
【讨论】: