# Finding all available methods from a component

**URL:** <https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670>\
**Category:** Ignition\
**Created:** [February 6, 2015, 1:18pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670 "2015-02-06T13:18:00Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Amarth](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/amarth/32/3313_2.png) [@Amarth](https://forum.inductiveautomation.com/u/Amarth)\
**Post date:** [February 6, 2015, 1:18pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/1 "2015-02-06T13:18:00Z")

</div>

Hello,

I was wondering if there is a way to fetch all methods available from a component. In this topic, I can see a setVerticalScrollBarPolicy() function but I have absolutely no idea about where it ccomes from.

[Subject: Check for vertical scroll bar](https://www.inductiveautomation.com:443/forum/viewtopic.php?p=48364#p48364)

I’ve looked a little further and with the following code, i managed to get some of a component methods, but obviously not all as I can not find the setVerticalScrollBarPolicy() function in the returned array.

```auto
powerTable = event.source.parent.getComponent('Power Table')
powerTableClass = powerTable.getClass()
print powerTableClass.getDeclaredMethods()
```

How can I find all methods ?

Regards.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [February 6, 2015, 2:45pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/2 "2015-02-06T14:45:30Z")

</div>

I’ve attached the introspect() function that I wrote years ago (in the FPMI days). Still handy today. I suggest you load it as a shared module, then call it like:

`powerTable = event.source.parent.getComponent('Power Table')
shared.inspect.introspect(powerTable)`  
~~inspect.py (3.09 KB)~~

Edit: Link expired. Use the version shown below.

---

<div class="post-metadata">

**Author:** ![JGJohnson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jgjohnson/32/29582_2.png) [@JGJohnson](https://forum.inductiveautomation.com/u/JGJohnson)\
**Post date:** [February 6, 2015, 3:02pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/3 "2015-02-06T15:02:50Z")

</div>

[quote=“pturmel”]I’ve attached the introspect() function that I wrote years ago (in the FPMI days). Still handy today. I suggest you load it as a shared module, then call it like:

`powerTable = event.source.parent.getComponent('Power Table')
shared.inspect.introspect(powerTable)`[/quote]

Nice! Thanks for sharing. ![:thumb_left:](https://us1.discourse-cdn.com/inductiveautomation/original/1X/e26afb081ddde6df016df6ee49159cf56aaca688.gif ":thumb\_left:")

---

<div class="post-metadata">

**Author:** ![Amarth](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/amarth/32/3313_2.png) [@Amarth](https://forum.inductiveautomation.com/u/Amarth)\
**Post date:** [February 6, 2015, 3:14pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/4 "2015-02-06T15:14:11Z")

</div>

Awesome !

Thank you very much.

---

<div class="post-metadata">

**Author:** ![zackscriven](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/zackscriven/32/7213_2.png) [@zackscriven](https://forum.inductiveautomation.com/u/zackscriven)\
**Post date:** [May 9, 2017, 6:01pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/5 "2017-05-09T18:01:52Z")

</div>

Looks like the link is broken now with the new forum? Or is that just me?

---

<div class="post-metadata">

**Author:** ![nmudge](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nmudge/32/3394_2.png) [@nmudge](https://forum.inductiveautomation.com/u/nmudge)\
**Post date:** [May 9, 2017, 6:47pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/6 "2017-05-09T18:47:04Z")

</div>

Hi Zack,

The download doesn’t work for me either.

There is also an Ignition template available that can show all the methods of a component. It is called the Graphical Object Inspector. You can see it and get it at the blog post at this link: [http://nickmudge.info/post/graphical-object-inspector-in-ignition](http://nickmudge.info/post/graphical-object-inspector-in-ignition)

---

<div class="post-metadata">

**Author:** ![zackscriven](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/zackscriven/32/7213_2.png) [@zackscriven](https://forum.inductiveautomation.com/u/zackscriven)\
**Post date:** [May 9, 2017, 6:53pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/7 "2017-05-09T18:53:10Z")

</div>

I was looking for a way to change the scroll speed of the template repeater and I came across your post from a while back.

Double Thanks!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 10, 2017, 6:05pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/8 "2017-05-10T18:05:49Z")

</div>

The introspection script has evolved over time, particularly to return a string result instead of just printing. I found that useful for introspection in gateway scope using runScript() in an expression tag. Or to set the .text property of a scrollable text edit field for convenience. This is what it looks like today:

```auto
# Introspection for Jython/Java
#
# Copyright 2008-2016 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
	result = "Python Type: %s\n" % type(obj)
	c = obj.getClass()
	basetype = str(c)
	result += "Java Type: %s\n" % basetype
	skips = []
	for m in c.getMethods():
		try:
			newtype = str(m.getDeclaringClass())
			if newtype != basetype:
				basetype = newtype
				result += "\nFrom Type: %s\n" % 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())
			result += " M: %s(%s)\n" % (" ".join(mods), ",".join(pt))
			if len(rt)>=30:
				result += " returns %s\n" % rt
		except Exception:
			pass
	for f in c.getFields():
		try:
			newtype = str(f.getDeclaringClass())
			if newtype != basetype:
				basetype = newtype
				result += "\nFrom Type: %s\n" % basetype
			anno = []
			for a in f.getAnnotations():
				anno.append(str(a))
			anno.append(str(f.getType()))
			anno.append(f.getName())
			skips.append(f.getName())
			result += " F: %s\n" % (" ".join(anno))
		except Exception:
			pass
	result += "\nFrom python dir():\n"
	for x in dir(obj):
		if x not in skips:
			try:
				if callable(getattr(obj,x)):
					result += " Method %s %s\n" % (x, type(getattr(obj,x)))
				else:
					y = getattr(obj, x)
					result += " Property %s %s %s\n" % (x, type(y), y)
			except:
				result += " Unreadable %s\n" % x
	return result

```

---

<div class="post-metadata">

**Author:** ![maidamar](https://avatars.discourse-cdn.com/v4/letter/m/0ea827/32.png) [@maidamar](https://forum.inductiveautomation.com/u/maidamar)\
**Post date:** [May 11, 2017, 7:37pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/9 "2017-05-11T19:37:07Z")

</div>

There is also the [Ignition SDK Programmers Guide](https://docs.inductiveautomation.com:8443/display/SE/Introduction) where they have a lot of information on the _behind the scenes_ of the objects in Ignition.  
They have a JavaDocs for Ignition [v7.8](http://files.inductiveautomation.com/sdk/javadoc/ignition784rc1/index.html) and for [v7.9](http://files.inductiveautomation.com/sdk/javadoc/ignition79/790-beta1/index.html) there, which I oftentimes found very useful.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [July 29, 2021, 4:45pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/10 "2021-07-29T16:45:08Z")

</div>

Hey @pturmel, I’m using 8.1.5, vision, and couldn’t get this to work (returned nothing) unless I removed the first try/except.

I’m calling using a button `actionPerformed` to text area:

```auto
obj = event.source.parent.getComponent('Button')
result = shared.inspect.introspect(obj)
event.source.parent.getComponent('Text Area').text = result

```

I guess it really doesn’t matter if I removed the try/except, but curious if you knew why.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [July 29, 2021, 4:50pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/11 "2021-07-29T16:50:32Z")

</div>

No idea. Haven’t had to use it in a while. Might play later.

---

<div class="post-metadata">

**Author:** ![jsorlie](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jsorlie/32/3645_2.png) [@jsorlie](https://forum.inductiveautomation.com/u/jsorlie)\
**Post date:** [July 30, 2021, 10:27pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/12 "2021-07-30T22:27:36Z")

</div>

FWIW you can use dot-completion in the interactive interpreter (right-pane) of script console to popup list of methods for an object after executing script in left-pane.

 ![20210730-15h31m13.936-874](https://us1.discourse-cdn.com/inductiveautomation/original/3X/9/b/9bd914f3e2112cb770f585b03c5d6f23a4518b29.png)

Phil’s (@pturmel) [tool](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/8) is cool!

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [July 30, 2021, 11:31pm UTC](https://forum.inductiveautomation.com/t/finding-all-available-methods-from-a-component/9670/13 "2021-07-30T23:31:45Z")

</div>

How would you use that for a button component, for example?
