I try to use this code (Update m_set is used inside for loop which goes through few methods which use different type arguments. If I would add for example int.class in getMethod
, I would get error after one iteration, because next method would require String.class. Is it possible to solve such problem using reflection?):
Method m_set = product.getClass().getMethod(method_name);
m_set.invoke(product, method_value);
I get this error:
Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.setHeight()
at java.lang.Class.getMethod(Class.java:1655)
at test.ProductTrader.create(ProductTrader.java:68)
at test.Test.main(Test.java:32)
In error it shows that it tries to find method in class that I use this method. But that method is in parent class and it is public method. I know if I would use getDeclaredMethod
, it would give similar error, but why it gives this error using getMethod
?
My class thas has this method:
public abstract class AbstractChair {
public String name;
public int height;
public AbstractChair() {
}
public AbstractChair(String name, int height){
this.name = name;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
My class that I try to use this method on:
public class NormalChair extends AbstractChair {
public NormalChair() {
super();
}
public NormalChair(String name, int height) {
super(name, height);
}
// Copy constructor
public NormalChair(NormalChair chair) {
this(chair.getName(), chair.getHeight());
}
}
Update2
If I do something like this:
if(method_name == "setHeight"){
Method m_set = product.getClass().getMethod(method_name, int.class);
m_set.invoke(product, method_value);
}
else if (method_name == "setName")
{
Method m_set = product.getClass().getMethod(method_name, String.class);
m_set.invoke(product, method_value);
}
Then error disappears. Can someone suggest more universal approach?
It seems that you forgot to pass type of arguments that your method needs (remember that methods can be overloaded with different arguments types). Take a look at your code, there is no
setHeight()
method there butsetHeight(int)
. You should try something likeSince you could have problems with primitive types you can use way around. Assuming that there is only one method with same name in your class you want to find you can iterate over all public methods, compare its name with method you are looking for, and then invoke it with arguments you want. Something like
Another and probably better way would be using classes from
java.bean
package likePropertyDescriptor
. Thanks to this class you can find getters and setters for specific property. Notice that property forsetHeight
isheight
so you would need to use it likeUse
product.getClass().getMethod("setHeight", int.class);
. You have to pass the method parameters types to target the method signature.