Below is an example to show in a simple way how to we can use reflection to call methods.
First, we will implement a common User Class :
public class User{
private String name;
private String email;
private String password;
private User(){}
public User(String password, String name, String email) {
this.password = password;
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// Methods with Validator in the name
public boolean emailValidator(){
return this.email.contains("@");
}
public boolean passwordValidator(){
return this.password.length() > 4;
}
// This here is only to show to you that this
// method don't will be called in this example.
public boolean otherExternalValidator(boolean value){
return value == true;
}
}
So, we have 3 methods with the word “Validator”. In this case, we want call only public methods that ends with “Validator”, don’t receive parameters and return a boolean value.
Let’s go to see de code :
/*
* @param obj
* @throws Exception
*/
public void callValidatorsMethods(Object obj) throws Exception{
Class<?> clazz = obj.getClass();
// Interation in all public methods of the class
for(Method m : clazz.getMethods()){
if(m.getName().endsWith("Validator") &&
// Here we put a condition for get
// the methods that return a boolean,
// also can be a lot of types like
// a void return(no return).
m.getReturnType() == boolean.class &&
// We can validate the parameters of the method
// remember in Java Language we can have a lot
// of methods with the same name but with
// diferents parameters (size or types)
m.getParameterTypes().length == 0){
// Here we are invoking the method that you found
// in the class
Boolean result = (Boolean) m.invoke(obj);
System.out.println("Method Name: " + m.getName()
+ "Result: " + result);
}
}
}
Now, we will implement a code to call:
@Test
public void testCallValidatorsMethods() throws Exception {
String name = "Name user";
String email = "validaEmail@email.com";
String password = "123123123";
User validUser = new User(password, name, email);
callValidatorsMethods(validUser);
System.out.println("***************************");
System.out.println("The user with no valid email ");
name = "Name user";
email = "validaEmail";
password = "123123123";
User UnValidUser = new User(password, name, email);
callValidatorsMethods(UnValidUser);
}
Bellow is the console log :

Important :
We can call private methods by reflection, the same way, we can get attributes which are declared like private in the class.
Class<?> clazz = obj.getClass(); // Return all public methods obj.getClass().getMethods(); // Return all declared methods in the class ( public or not ) obj.getClass().getDeclaredMethods();