Introspection for Jython/Java

Modifié le  Mon, 23 Oct 2017 sur 01:20 PM

Code :

# Introspection for Jython/Java
#
# Copyright 2008-2012 Automation Professionals, LLC <sales@automation-pros.com>
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
#   1. Redistributions of source code must retain the above copyright notice,
#      this list of conditions and the following disclaimer.
#   2. Redistributions in binary form must reproduce the above copyright notice,
#      this list of conditions and the following disclaimer in the documentation
#      and/or other materials provided with the distribution.
#   3. The name of the author may not be used to endorse or promote products
#      derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.

#------------
def introspect(obj):
  """Describe the methods and properties available in the given object,
  from both the jython perspective, and the java perspective."""
  from java.lang import reflect
  print "Python Type: %s" % type(obj)
  c = obj.getClass()
  basetype = str(c)
  print "Java Type:   %s" % basetype
  skips = []
  for m in c.getMethods():
    try:
      newtype = str(m.getDeclaringClass())
      if newtype != basetype:
        basetype = newtype
        print
        print "From Type:   %s" % basetype
      mods = []
      if m.getModifiers() & reflect.Member.PUBLIC:
        mods.append('public')
      for a in m.getTypeParameters():
        mods.append(str(a))
      rt = str(m.getReturnType())
      if len(rt)<30:
        mods.append(rt)
      mods.append(m.getName())
      pt = []
      for p in m.getParameterTypes():
        pt.append(str(p))
      skips.append(m.getName())
      print "  M: %s(%s)" % (" ".join(mods), ",".join(pt))
      if len(rt)>=30:
        print "    returns %s" % rt
    except Exception:
      pass
  for f in c.getFields():
    try:
      newtype = str(f.getDeclaringClass())
      if newtype != basetype:
        basetype = newtype
        print
        print "From Type:   %s" % basetype
      anno = []
      for a in f.getAnnotations():
        anno.append(str(a))
      anno.append(str(f.getType()))
      anno.append(f.getName())
      skips.append(f.getName())
      print "  F: %s" % (" ".join(anno))
    except Exception:
      pass
  print
  print "From python dir():"
  for x in dir(obj):
    if x not in skips:
      try:
        if callable(getattr(obj,x)):
          print "  Method     %s %s" % (x, type(getattr(obj,x)))
        else:
          print "  Property   %s %s" % (x, type(getattr(obj,x)))
      except:
        print "  Unreadable %s" % x



Cet article a-t-il été utile ?

C'est super !

Merci pour votre commentaire

Désolé ! Nous n'avons pas pu vous être utile

Merci pour votre commentaire

Dites-nous comment nous pouvons améliorer cet article !

Sélectionner au moins l'une des raisons

Commentaires envoyés

Nous apprécions vos efforts et nous allons corriger l'article