How to Invoke Method by Name in Java Dynamically Using Reflection? Example
In Java you can invoke any method by its string name dynamically using reflection API. java.lang.reflect API provides powerful reflection mechanism which can load classes by its name even if classes are not available at compile time, Can get all methods including private and public from class and allow you to invoke any method dynamically using reflection. For those who are new to Java this sound pretty strange that at runtime you provide a method name using string and Java can run that method without any code for calling the method during compilation, but Reflection is such a powerful mechanism it allows to do a lot of stuff dynamically and if you been using IDE like Netbeans or Eclipse, a J2EE framework like Spring and Struts , these all used reflection to provide powerful configuration module and several other useful features like code assist etc.
Reflection is very comprehensive topic and there is a lot to learn but we will start with simple Java program example to invoke a method using reflection in by providing name of method as String value.
This Java article is continuation of my post on covering basic concepts like static and dynamic binding in Java, when to use Interface in Java and why use PreparedStaement in Java. If you are new here or haven’t read them already then you may find them useful.
Java Program to invoke method by name dynamically using Reflection
java.lang.reflect package have a class called Method which represent method Reflectively and Method.invoke() is used to call any Java method dynamically using reflection. Method.invoke() takes an object whose method has to call and list of parameters to be passed to method and throws InvocationTargetException if called method throws any Exception. here is complete code example of calling method dynamically in Java using Reflection:
import java.lang.reflect.InvocationTargetException ;
import java.lang.reflect.Method ;
import java.util.List ;
/**
* Simple Java program to invoke method by providing name as String.
* Reflective calls are slower than normal call so calling method using reflection
* should be use carefully.
*/
public class MethodInvocationReflection
public static void main ( String args []) <
Class loadedList = null ;
List list = null ;
try <
//loading class dynamically using reflection
loadedList = Class. forName ( «java.util.ArrayList» ) ;
list = ( List ) loadedList. newInstance () ;
//calling method using an interface on a reflective instance
list. add ( «abc» ) ;
list. add ( «bcd» ) ;
> catch ( InstantiationException ex ) <
System. err . println ( «Not able to create Instance of Class» ) ;
> catch ( IllegalAccessException ex ) <
System. err . println ( «Not able to access Class» ) ;
> catch ( ClassNotFoundException ex ) <
System. err . println ( «Not able to find Class» ) ;
>
try <
//getting method instance reflectively
Method m = loadedList. getMethod ( «size» , ( Class []) null ) ;
//calling method in java using reflection dynamically
Object size = m. invoke ( list, ( Object []) null ) ;
System. out . println ( «Result of dynamically invoking method in Java, Size: » + size ) ;
> catch ( NoSuchMethodException ex ) <
System. err . println ( «Not able to find Method on class» ) ;
ex. printStackTrace () ;
> catch ( SecurityException ex ) <
System. err . println ( «Security Exception raised» ) ;
ex. printStackTrace () ;
> catch ( IllegalAccessException ex ) <
System. err . println ( «Not able to access method » ) ;
ex. printStackTrace () ;
> catch ( IllegalArgumentException ex ) <
System. err . println ( «Incorrect supplied arguments» ) ;
ex. printStackTrace () ;
> catch ( InvocationTargetException ex ) <
System. err . println ( «Not able to invoke method by String in Java» ) ;
ex. printStackTrace () ;
>
>
>
Important points while calling Java method using reflection:
Here are few points worth noting while invoking method by giving its name and using reflection, I agree that reflection provides flexibility but it also has some disadvantage :
1) Reflection in Java has serious performance issues and calling same method reflectively is more than 2 to 3 times slower than normal method call even in modern JVM, So use reflection only if its genuinely needed and there is no other way around.
2) Invoking method using reflection also has some disadvantage like compile time checking of method parameters, order of parameters and return type etc. Since we use method.invoke() to call methods we lose all compile time checks and any typo or error will only be reflected in run time wrapped under InvocationTargetException .
3) Another problem is too much code for invoking method or creating instance using reflection as you see we have written 20 line of code to invoke a method which can be converted into just two lines if you call any method normally.
4) Last thing to note is using Interface object for calling method instead of using reflection or invoking method by name. if you see above Java program to invoked method by name, we have used List interface type to refer object created using reflection and called method List.add() like normal method only List.size() is called reflectively . This is one of best practices while using reflection.
That’s all on how to invoke method by name in Java dynamically using Reflection. Reflection is powerful but use it with caution. Call method with it’s interface even if Class is loaded dynamically using reflection, that is better than calling method by its string name using method.invoke() .
How to change the method names dynamically using for Loop ?
posted 10 years ago
I am having methods called setStAmount1(),setStAmount2() . setStAmount10() . I am not sure how many setStAmount() methods I will call . I will call depending upon the values I get in the bean. How to make that method name dynamic ? I need to append setStAmount+value of i to the method name by looping it . Please suggest a solution.
Bartender
posted 10 years ago
- 2
I am having methods called setStAmount1(),setStAmount2() . setStAmount10() . I am not sure how many setStAmount() methods I will call .
It’s hard to say for sure without real requirements and use cases, but that looks like bad design.
I will call depending upon the values I get in the bean. How to make that method name dynamic ? I need to append setStAmount+value of i to the method name by looping it . Please suggest a solution.
If you’re dead set on pursuing this approach, you can use Java’s reflection mechanism. Google for java reflection tutorial, look at java.lang.Class.getDeclareMethod() and getDeclaredMethods(), and java.lang.reflect.Method.invoke(). However, I suggest you first look into using an array, List, or Map for this.