I am trying to make a program that executes a particular method when the class name and method name are passed as String parameter to the caller. Consider the code below. I
What to do now???
You can now call the method on your carObj
like this:
Method method = carObj.getClass().getMethod(methodName);
method.invoke(carObj);
See also:
Method.invoke
If all you are trying to do is call a method by name, you don't need to cast it to anything. It is sufficient to use the Object
with further reflection.
See Class.getDeclaredMethod(), as in:
Object carObj = ...;
Method method = carObj.getClass().getDeclaredMethod(methodName, ...);
Object retObj = method.invoke(carObj, ...);
Note that we don't care what type carObj
actually is, although if you wanted to check you could always use instanceof
or Class.isAssignableFrom
or Class.isInstance
.
It is a bit weird, though, that you are instantiating a new object then calling one of its methods all in one go. That object goes away once your runTheMethod
returns.
By the way, it looks like you're just trying to get and set bean properties. You might want to have a look at Apache Commons BeanUtils instead, then your example becomes simply:
CarBean bean = ...;
String color = (String)PropertyUtils.getSimpleProperty(bean, "color"); // calls getter.
I doubt you really need to do this. I suspect you have an XY Problem. Your question is somewhat similar to asking whether Java has an eval
function and the correct answer is similar:
First ask yourself, where did these String
come from? Did another part of your program generate them, or was it input provided by the user?
Another part of my program generated it: so, you want one part of your program to decide the kind of operation to perform, but not perform the operation, and a second part that performs the chosen operation. Instead of generating and then evaluating String
s, use the Strategy, Command or Builder design pattern, as appropriate for your particular case.
It is user input: the user could input anything, including class and method names that, when executed, could cause your program to misbehave, crash, expose information that should be secret, damage persistent information (such as the content of a database), and other such nastiness. The only way to prevent that would be to parse the String
s and then either immediately execute the method on a successful parse, or have the parser create a Command object for later execution.