Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java dynamically call methods

I'm trying to figure out how to dynamically call a method. I have a string that describes the method name, but I'm not sure how to do it. I thought this could be done with reflection, but haven't had any success. Example

set.add(vehicleConfiguration.getVehicleYear.getName());

set.add(vehicleConfiguration.getVehicleMake().getName());

set.add(vehicleConfiguration.getVehicleModel().getName());

You'll notice all the method calls are the same with the exception of the getVehicleYear, etc

I have a string that describes the method names, just not sure how to use it.

I got as far as this with reflection, but failed.

set.add(Class.forName("VehicleConfiguration").getMethod("vehicleMake", null).getName());

Thanks in advance.

like image 995
Code Junkie Avatar asked Jun 17 '26 19:06

Code Junkie


1 Answers

The class you are looking for is Method. Please read the appropriate javadoc carefully.

You can get a method with, for example

// assumign `getVehicleMake` is the name of the method and it accepts no parameters
Method method = VehicleConfiguration.class.getMethod("getVehicleMake"); 
// VehicleConfiguration.class can be replaced by
// Class.forName("VehicleConfiguration") 
// if VehicleConfiguration is the fully qualified, ie. with packages, name of the class
// other you need Class.forName("com.yourpackage.VehicleConfiguration")

You then need to invoke() this method on an instance of your class.

VehicleConfiguration instance = new VehicleConfiguration();

Object returnObject = method.invoke(instance); // assuming no parameters

To then call getName(), you need to cast the returned object to the type that has the method. Assuming getMake() is a method of the type VehicleMake, call it like this

((VehicleMake)returnObject).getMake();
like image 60
Sotirios Delimanolis Avatar answered Jun 19 '26 08:06

Sotirios Delimanolis



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!