27

I have a String array that contains names of method in the yyyyyy class

In the xxxxxx class I'm making a yyyyyy instance (say obj). Now I can call obj.function_name(), except I want to read function_name from the String array in a loop. Is this possible?

6
  • 1
    Can you elaborate ? Its not so clear to understand. Commented Jun 16, 2010 at 5:47
  • 3
    I believe the term you're looking for is "reflection". Commented Jun 16, 2010 at 5:47
  • Yes, using reflection and dynamic method invocation you can do this. If you google "java dynamic method invocation" you'll get some interesting hits. Here is a tutorial. This implements a kind of plotting language like you are describing. Commented Jun 16, 2010 at 5:51
  • and i'm also sure what he meant is this one: stackoverflow.com/questions/160970/… Commented May 2, 2012 at 7:54
  • Also see stackoverflow.com/questions/160970/… Commented Jan 18, 2013 at 14:01

2 Answers 2

41

You can, using reflection. It is done by calling Yyyy.class.getMethod("methodName").invoke(someArgs)

You'd have to handle a bunch of exceptions, and your method must be public. Note that java coding conventions prefer methodName to method_name.

Using reflection, however, should be a last resort. You should be using more object-oriented techniques.

If you constantly need similar features, perhaps you can look at some dynamic language running on the java platform, like Groovy

Sign up to request clarification or add additional context in comments.

Comments

26

It's possible using reflection, although you should probably question your design somewhat if you need that sort of behavior. Class.getMethod takes a String for the method name and returns a Method object, which you can then call .invoke on to call the method

These Javadoc pages should be helpful:

Sample code (assuming the yyyyyy methods take one int argument, just to show argument passing):

yyyyyy obj = new yyyyyy();
String[] methodNames = {"foo", "bar", "baz"};
for(String methodName : methodNames) {
    Method method = Class.forName("yyyyyy").getMethod(methodName, new Class[] {int.class});
    method.invoke(obj, 4); // 4 is the argument to pass to the method
}

4 Comments

Why don't you use obj.getClass() in stead of Class.forName("yyyyyy") ?
links are messed up, try replacing ( with %28 and ) with %29
@Marc I actually prefer yyyyyy.class over either, but any work
@Michael Mrozek the advantage of using obj.getClass() is that it always returns the correct type, even after refactoring the obj variable.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.