Самоанализ метода Java от JRuby - PullRequest
3 голосов
/ 02 июня 2010

Есть ли путь от JRuby к самоанализу объекта Java и выяснению его методов Java-land? Как то, что http://github.com/oggy/looksee обеспечивает, но для Java. Или как

(someobject).methods - 1.methods

Было бы неплохо просто взглянуть на то, что предоставляет объект Java, вместо APIDoc для него.

Ответы [ 2 ]

6 голосов
/ 10 августа 2011

Используйте базовый класс Java и нормальное отражение, чтобы получить только методы Java:

java.lang.String.java_class.declared_instance_methods

Это напрямую сопоставляется с вызовом метода Class.getDeclaredMethods() Java и дает массив Java::JavaMethod объектов для каждого метода экземпляра Java в целевом классе.

6 голосов
/ 02 июня 2010

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, поэтому мы фактически получаем оба методы Java и Ruby, но отказываясь от всех методов с символами, которые являются необычными или недопустимыми в Java, мы получаем достаточно чистый список, а остальные методы Ruby не являются , которые трудно обнаружить.

...