Johnny
Johnny

Reputation: 121

Java equivalent of python's getattr?

I'm converting some python code to java, and have a situation where I need to call methods of an object but don't know which methods until runtime. In python I resolve this by using getattr on my object and passing it a string that is the name of my method. How would you do something similar in Java?

Upvotes: 12

Views: 6184

Answers (6)

NPE
NPE

Reputation: 500317

Class.getField is your friend. It probably won't be very straightforward though since Python is dynamically typed and Java is statically typed (unless you know the types of your fields in advance.)

EDIT: How to translate these examples.

Attribute Lookup

Python

//normal
value = obj.attribute

//runtime
value = getattr(obj, "attribute")

Java

//normal
value = obj.attribute;

//runtime
value = obj.getClass().getField("attribute").get(obj);

**Method Call**

Python

//normal
result = obj.method(args)

//runtime 
func = getattr(obj, "method")
result = func(args)

Java

//normal
result = obj.method(args);

//runtime
Method func = obj.getClass().getMethod("method", Object[].class);
result = func.invoke(obj, args);

In the simpler cases, you need to know whether you have a field or a method. esp as they can have the same name. Additionally methods can be overloaded, so you need to know which method signature you want.

If you don't care which method or field you get, you can implement this as a helper method fairly easily.

Upvotes: 21

Karthik
Karthik

Reputation: 196

The easiest way to handle this is to create a Map object in Java class & keep adding the name value pairs & retrieve it accordingly though it might not support different types that setAttr supports.

Upvotes: 0

Aaron Digulla
Aaron Digulla

Reputation: 328594

You should use the Reflection API. Since the pure API is a bit ... unapproachable, you should have a look at helpers like commons beanutils or reflections.

Upvotes: 0

Dmitri
Dmitri

Reputation: 9157

In Java you do this with the Reflection API (and it's usually pretty cumbersome).

MethodUtils in Apache Commons BeanUtils project may make it a bit easier to work with, though it's a pretty hefty dependency for something simple like this.

Upvotes: 0

khachik
khachik

Reputation: 28693

You can use java reflection but there is no exact equivalent of getattr.

Upvotes: 0

kgiannakakis
kgiannakakis

Reputation: 104178

You can start here to learn about Java Reflection.

Upvotes: 0

Related Questions